2015-03-09 5 views
3

Давайте предположим, что у меня есть таблица T1 с людьми идентификаторами и другими идентификаторами вещи, как следующегопроверить, если столбец содержит все значения другого столбца - Mysql

Table: T1 
personID | stuffID 
    1 | 1 
    1 | 2 
    1 | 3 
    1 | 4 
    2 | 1 
    2 | 4 
    3 | 1 
    3 | 2 

И еще таблицы T2 с помощью только одного столбца stuffIDs

Table: T2 
stuffID 
    1 
    2 
    3 

результат, который я хотел бы получить, по SELECT, таблица peopleIDs, которые связаны со ВСЕМИ stuffIDs Т2.

Следуя примеру, результатом будет только идентификатор 1 (идентификатор personID 3 не должен появляться, даже если все связанные с ним идентификаторы содержатся в T2.stuffID).

ответ

3

Если я правильно понимаю, вы хотите, чтобы получить все PersonId-х из T1, что все связанные stuffID обнаружили в Т2.

Вы можете разбить это следующим образом: Прежде всего, найти все записи T1, которые соответствуют с вложенным запросом

SELECT personID 
FROM T1 WHERE stuffID IN (SELECT stuffID FROM t2) 

Теперь вам нужно проверить, какие из записей в этом наборе содержит ВСЕ stuffID систем вы хотите

GROUP BY personID 
HAVING COUNT(DISTINCT stuffID) = (SELECT COUNT(stuffID) FROM t2) 

и все это вместе:

SELECT personID 
FROM T1 WHERE stuffID IN (SELECT stuffID FROM t2) 
GROUP BY personID 
HAVING COUNT(DISTINCT stuffID) = (SELECT COUNT(stuffID) FROM t2) 

HTH.

+0

Привет, Эдди! Спасибо за ваш ответ! Я пробовал, и он должен работать очень хорошо (я проверю его через несколько часов с моими данными). Есть еще одна небольшая проблема: в моем случае T2 - временная таблица, которую я создаю непосредственно перед «SELECT». Ваш код работает с обычной таблицей, но не является временным. Сообщение Sql: # 1137 - Не удается открыть таблицу: «T2». Знаете ли вы, почему? Большое спасибо – Marco

+0

Привет, Марко, если вы не предоставите SQL, который используете, тогда я могу только догадываться о проблеме - обратите внимание, что вы не можете ссылаться на временную таблицу более одного раза в одном запросе - см. Http: // dev .mysql.com/doc/refman/5.0/en/tempor-table-problems.html – Eddy

+1

Большое спасибо. Я решил создать два экземпляра временной таблицы. Еще раз спасибо за вашу любезную поддержку. (кстати, я использую MySQL с phpMyAdmin 4.1.7 админ-сайта веб-сайта) – Marco

0
select personID from T1 group by personID having count(distinct stuffID) in (select count(distinct stuffID) from T2) 

select count(distinct stuffID) from T2 < - бы дать общее число различных countIDs

group by personID having count(distinct stuffID) < - после того, как группировка по PersonId, подсчета количества stuffIds, что PersonId имеет.

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

2
select personID 
from T1 
where stuffID in (select stuffID from t2) 
group by personID 
having count(distinct stuffID) = (select count(*) from t2) 

выбрать stuffids т.е. человека, которые находятся в T2, считать их (различны только), и проверить такое же количество, как и в t2.

0

Попробуйте

select personID from T1 
    group by personID 
    having count(distinct stuffID) >= (select count(*) from t2) 
+1

Пройдет любой человек с 3 различными файлами идентификатора, например. 4,5,6 ... – jarlh

0

Использование count - эффективный подход. Кроме того, с точки зрения теории множеств вы можете думать об этом следующим образом: для действительного идентификатора personID мы не сможем найти идентификатор stuff в T2, но не подключаемся к этому идентификатору person в T1. Поэтому мы можем сделать это следующим образом:

SELECT DISTINCT T1.personID 
FROM T1 
WHERE NOT EXISTS (
    SELECT T2.stuffID 
    FROM T2 
    WHERE T2.stuffID NOT IN (
    SELECT DISTINCT T1copy.stuffID 
    FROM T1 T1copy 
    WHERE T1copy.personID=T1.personID)); 
Смежные вопросы