2011-01-01 2 views
1

У меня есть сказать, 5 таблиц, user , t1, t2, t3, t4 user имеет поле под названием id. t1 до t4 все имеют соответствующее поле под названием user_id и поле под названием verification.Пожалуйста скажите мне MySQL запрос

Теперь нужно отчетливо (или однозначно) выберите user из user table, которого id существует по крайней мере один раз в по меньшей мере одной таблицы между t1 к t4, и где verification поле true.

ответ

3

Из вашего подробного описания видно, что вы находитесь рядом с решением. EXISTS и OR должны быть использованы (при условии, что значение TRUE заменяется 1):

SELECT id FROM User u WHERE 
    EXISTS(SELECT 1 FROM t1 WHERE u.id = t1.user_id AND t1.verification =1) 
    OR EXISTS(SELECT 1 FROM t2 WHERE u.id = t2.user_id AND t2.verification =1) 
    OR EXISTS(SELECT 1 FROM t3 WHERE u.id = t3.user_id AND t3.verification =1) 
    OR EXISTS(SELECT 1 FROM t4 WHERE u.id = t4.user_id AND t4.verification =1) 
+0

У этого есть несколько проблем, производительность и неправильные имена столбцов, 'u.user_id' не существует, например, это' u.id' .... поскольку * другая * часть запроса имеет :) –

+0

, так что это id в одной таблице и user_id в других - эй, это разумно !! –

+1

@Nick Craver - EXISTS имеет более высокую производительность по сравнению с UNION. Поскольку EXISTS необходимо найти только одну запись, в то время как UNION ожидает больших манипуляций с множеством. Также хорошо известно, что в большинстве SQL-реализации EXISTS более предпочтительна, чем IN. – Dewfy

1

Скучная, а не сложно:

SELECT id FROM User JOIN t1 ON user.id = t1.user_id WHERE verification = TRUE 
UNION 
SELECT id FROM User JOIN t2 ON user.id = t2.user_id WHERE verification = TRUE 
UNION 
SELECT id FROM User JOIN t3 ON user.id = t3.user_id WHERE verification = TRUE 
UNION 
SELECT id FROM User JOIN t4 ON user.id = t4.user_id WHERE verification = TRUE 
+0

Вы бы нужно 'UNION DISTINCT', чтобы получить желаемый результат с таким подходом. –

+0

@Nick: Пожалуйста, объясните ... UNION ALL сохраняет дубликаты; UNION самостоятельно устраняет дубликаты; UNION DISTINCT нестандартен, потому что это подразумевает простой UNION. –

0

Я хотел бы использовать UNION set на t1 - t4 таблиц, чтобы получить user_id в тех, и использовать этот результат для IN() clause на user столе, как это:

SELECT * FROM user 
WHERE id IN (SELECT user_id FROM t1 WHERE verification = TRUE 
      UNION 
      SELECT user_id FROM t2 WHERE verification = TRUE 
      UNION 
      SELECT user_id FROM t3 WHERE verification = TRUE 
      UNION 
      SELECT user_id FROM t4 WHERE verification = TRUE)' 

Просто по природе, как IN() работы, вы получите отличные результаты user таблицы, а также.

0

Попробуйте это:

select 
     distinct u.user 
from 
     user u 
where 
     exists (
     (select user_id from t1 where t1.user_id = u.id and t1.verification = true) 
    OR (select user_id from t2 where t2.user_id = u.id and t2.verification = true) 
    OR (select user_id from t3 where t3.user_id = u.id and t3.verification = true) 
    OR (select user_id from t4 where t4.user_id = u.id and t4.verification = true) 
    ) 
Смежные вопросы