2017-02-05 56 views
2

与存在的另一个表中的指示选择表中的所有行我有三个表使用MySQL查询

Table a 
+-----+-------+ 
| aid | value | 
+-----+-------+ 
| 1 | A  | 
| 2 | B  | 
| 3 | C  | 
| 4 | D  | 
+-----+-------+ 

Table b 
+-----+------+ 
| bid | name | 
+-----+------+ 
| 1 | A | 
| 2 | B | 
| 3 | C | 
+-----+------+ 

Table ba (mapping of table a and table b) 
+-----+-----+ 
| bid | aid | 
+-----+-----+ 
| 1 | 1 | 
| 2 | 1 | 
| 3 | 1 | 
| 3 | 2 | 
| 1 | 3 | 
| 2 | 3 | 
| 2 | 4 | 
+-----+-----+ 

在这些表中我要像

SELECT aid, mapped('true'-if(aid exist in ba) 'false'-otherwise) 
FROM a 
    JOIN b 
    JOIN ba 
WHERE bid=1 

查询得到的结果从哪里我可以生成一个列表

(when bid=1) 
A-mapped 
B-not mapped 
C-mapped 
D-not mapped 

(when bid=2) 
A-mapped 
B-not mapped 
C-mapped 
D-mapped 

(when bid=3) 
A-mapped 
B-mapped 
C-not mapped 
D-not mapped 

现在我在一个while循环中生成列表的所有行s的表'a',并在循环内为每个迭代执行查询以检查表'ba'中的存在。

回答

0

我想这应该是独立的表B:

SELECT CONCAT_WS('-', a.value, IF(ba.aid IS NULL, "-not mapped", "-mapped")) 
FROM a LEFT JOIN ba ON a.aid = ba.aid AND ba.bid = 1 
ORDER BY a.aid 

注:我把“一”表基表,因为你的样本包括从“一”表中的所有值。

+0

这是行不通的。 –

+0

@TimBiegeleisen它肯定会。 – smozgur

+0

不,它没有。你引用'ba.bid'甚至没有提到你的查询中的表。 –

0

这是一个棘手的问题,但难点在于弄清楚如何制定查询。一旦出现这种情况,它就会从这里走下坡路。一种方法是在A和B表之间使用交叉连接来获取所有可能的映射。然后LEFT JOIN到映射表以确定哪些对正被映射,哪些不是。请尝试以下查询:

SELECT tb.bid, ta.value, 
     CASE WHEN ba.bid IS NOT NULL THEN 'mapped' ELSE 'not mapped' END AS label 
FROM tb INNER JOIN ta  -- cross join to obtain all bid/aid pairs 
LEFT JOIN ba    -- to determine which pairs are mapped/not mapped 
    ON ta.aid = ba.aid AND tb.bid = ba.bid 
ORDER BY tb.bid, ta.value 

演示在这里:

SQLFiddle