MySQL Query - Получение различных значений - PullRequest
0 голосов
/ 13 октября 2009

Существует таблица "T", которая содержит данные, как показано ниже:

A   B
---------
3    5   
4    6      
7    10 
8    5 
9    12 
3    6
3    7
8    7

Принимая заданный входной набор {3,8} в качестве значений для A, как извлечь все различные значения B, для которых все значения во входном наборе имеют запись?

B
---
5
7

РЕДАКТИРОВАТЬ: Я думаю, что вопрос не достаточно ясен. Мне нужны значения в B, в которых есть запись со всеми значениями в данном наборе в качестве значения для столбца A. Таким образом, B = 6 не будет включен, поскольку нет записи с A = 8 и B = 6. Надеюсь, это проясняет!

Ответы [ 2 ]

5 голосов
/ 13 октября 2009
SELECT DISTINCT B 
FROM my_table WHERE A IN (3,8)

EDIT:

SELECT B FROM AB WHERE A = 3
INTERSECT
SELECT B FROM AB WHERE A = 8

INTERSECT дает вам строки, которые встречаются в обоих наборах результатов.

2-й РЕДАКТИРОВАТЬ:

SELECT B,COUNT(B) 
FROM AB WHERE A IN (3,8) 
GROUP BY B 
HAVING COUNT(B) = 2

Однако вы должны изменить это в двух местах: в аргументах IN и в конце в COUNT (B) =?. ? должно быть равно количеству аргументов. Я надеюсь, что это поможет.

3-е РЕДАКТИРОВАНИЕ:

SELECT B,COUNT(B) 
FROM 
(
    SELECT DISTINCT A, B FROM AB
) x
WHERE A IN (3,8) 
GROUP BY B 
HAVING COUNT(B) = 2

Это позволит избежать проблемы повторяющихся записей.

0 голосов
/ 14 октября 2009

По сути, вы можете создать два подзапроса, в которых вы отфильтровываете только те строки, которые являются подходящими для сопоставления (т. Е. A равно 3 или 8). Затем соедините эти строки друг с другом по значению B, и любые подходящие строки будут тем, что вы ищете. Я не уверен на 100% в синтаксисе MySQL, но я верю, что это сработает:

SELECT * FROM (SELECT * FROM T WHERE A = 3) t3 INNER JOIN (SELECT * FROM T WHERE A = 8) t8 ON t3.B = t8.B

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...