2016-11-15 105 views
2

取唯一值,现在我有一个交叉引用表,看起来像这样:来自交叉引用表

 Table job2pos 
╔═══════════╦═════════════╗ 
║ job_id ║ position_id ║ 
╠═══════════╬═════════════╣ 
║ 1  ║ 10   ║ 
║ 2  ║ 10   ║ 
║ 2  ║ 12   ║ 
║ 3  ║ 11   ║ 
║ 3  ║ 13   ║ 
║ 4  ║ 10   ║ 
║ 5  ║ 13   ║ 
╚═══════════╩═════════════╝ 

我要选择所有具有job_idpostion_id = 10position_id = 12,这将导致job_id = 1,2,2,4。但我只想要job_id = 2在我提取的结果中只出现一次。

我试过的代码如下:

$positions = ["10","12"]; 

$sql = "SELECT job2pos.job_id FROM job2pos 
WHERE job2pos.pos_id IN (?,?)"; 

$stmt = $pdo->prepare($sql); 

foreach ($positions as $key => &$val) { 
    $stmt->bindParam($key, $val, \PDO::PARAM_INT); 
} 

$stmt->execute(); 

var_dump($stmt->fetchAll(\PDO::FETCH_UNIQUE)); 

和上面的尝试将会产生如下结果:

array(3) { 
    [1]=> array(0) {} 
    [2]=> array(0) {} 
    [4]=> array(0) {} 
} 

所以我没有得到独特的价值观和额外的2不重复,但我该如何做到这一点,以便job_id不会作为索引出现,而是作为数组中的一个值出现?

  • P.S.如果你可以指出我的代码中的任何不必要的代码,那也会很棒。
+0

使用'标准'PDO :: FETCH_ASSOC' –

+0

或者'你目前的结果array_keys'选择distinct'。 –

+1

请在** position_id **之后将╬更改为╣。这太接近完美了。 – Mihailo

回答

2

特殊SELECT DISTINCT构造将只会从您的查询带来不同的值。所以,你可以重写你的代码为:

$postions = ["10","12"]; 
$sql = "SELECT DISTINCT job2pos.job_id FROM job2pos WHERE job2pos.pos_id IN (?,?)"; 
$stmt = $pdo->prepare($sql); 

// btw you don't have to bind elements one by one 
// you can pass array as an argument to execute: 
$stmt->execute($positions); 

print_r($stmt->fetchAll(\PDO::FETCH_ASSOC)); 
+0

非常感谢。 – Sarah