2017-02-05 2 views
2

У меня есть три таблицыВыбрать все строки из таблицы с указанием существования в другой таблице с помощью MySQL Query

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 

, чтобы получить результат откуда я могу сгенерировать список

Сейчас я создаю список в цикле while для всей строки s таблицы 'a' и внутри цикла выполняется запрос для каждой итерации, чтобы проверить существование в таблице 'ba'.

ответ

0

Я думаю, что это должно быть стол б независимы:

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

Смежные вопросы