[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: SELECT и условные операторы(две таблицы)
Godwarlock
Привет всем. Столкнулся с такой проблемой и никак пока не могу решить.
Пытаюсь собрать запрос для фильтрации, относительно сравнения по второстепенной таблице, но никак не выходит.
"SELECT * FROM table1 G WHERE EXISTS (SELECT id_table1,tag FROM table2 M WHERE G.id=M.id_table1 AND M.tag=10) AND EXISTS (SELECT id_table1,tag FROM table2 M WHERE G.id=M.id_table1 AND M.tag=35) OR EXISTS (SELECT id_table1,tag FROM table2 M WHERE G.id=M.uid_table1 AND M.tag=50)"

Что я хочу получить в этом запросе. По сравнению id=id_table1 я думаю понятно, т.е. id table1 совпадает с записью id_table1 таблицы table2, то условие верно. Основной вопрос состоит в поле tag. В данном случае, есть 2 условия.
Первое условие: Вытащить записи table1, если в table2 существуют записи tag=10, tag=35 и table1.id = table2.id_table1.
Второе условие: Помимо первого условия, стоит оператор OR, т.е "или", а значит помимо первого условия, должны вытаскиваться записи и этого условия. В данном случае tag = 50 и table1.id=table2.id_table1. Что я получаю в ответе. В ответе я получаю строки, только последнего условия, т.е после OR, условия до него не считывает и записи по ним не берутся. Также, если я уберу OR и всё, что после него, я получаю данные по первому условию. В чем может быть ошибка?
Помимо всего прочего, я не думаю, что этот запрос является "хорошим", возможно есть альтернативы, но я уже перепробовал множество вариантов, но не пришёл к истине даже с таким велосипедом, хотя если бы он работал как надо, я бы успокоился. Помогите пожалуйста разобраться. Соль еще в том, что выполнить всё это надо исключительно в одном запросе.
Kusss
может так ?
SELECT 
g.*
FROM
`table1` AS g
LEFT JOIN
table2 AS m ON m.id_table1 = g.id AND m.tag = 10 AND m.tag = 35
LEFT JOIN
table2 AS m2 ON m2.uid_table1 = g.id AND m2.tag = 50
WHERE
m.id IS NOT NULL OR
m2.id IS NOT NULL
Kusss
или вот так
SELECT 
g.*
FROM
`table1` AS g
LEFT JOIN
table2 AS m ON
(m.id_table1 = g.id AND m.tag = 10 AND m.tag = 35) OR
(m.uid_table1 = g.id AND m.tag = 50)
WHERE
m.id IS NOT NULL
Godwarlock
Не совсем то. JOIN не подходит в двух случаях. Во первых этот вариант я уже пробовал несколько раз, но понял, что нельзя сравнивать одинаковые поля одной записи, т.е m.tag = 10 AND m.tag = 35 просто по существу невозможно. Во вторых, тут речь идет о условиях выборки основной таблицы, а задача joina объединять записи двух и более таблиц, следовательно его задача заключается совсем в другом. В общем то моя версия с WHERE EXISTS работает, не сразу понял, но так и есть. Теперь всё ок. Полагаю иных вариантов просто не может быть. Но спасибо за ответ.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.