![]() |
Пмогите с SQl запросом.
Доброго времени суток.
Есть три таблицы: ------- Tabl_1 ------- norm_id Tabl_2_id Tabl_1_id ------- Tabl_2 ------- Tabl_3_id std_id Tabl_2_id ------- Tabl_3 ------- control Tabl_3_id Есть масив norm_id. 1. Я получаю из Tabl_1 все Tabl_2_id и Tabl_1_id где norm_id равно значениям масива. Tabl_1_id понядобятся в конце. Тут все ок. 2. Я получаю из Tabl_2 все Tabl_3_id где Tabl_2_id равны тем которые получены из прошлой таблицы. 3. Я должен составить запрос, который выдаст в первом столбце все Tabl_1_id выбраные на шаге 1, а во втором все control из Tabl_3, где Tabl_3 равно Tabl_3_id полученые на шаге 2. Количество значений колонок будут соответствовать 1:1. Для этого попробовал написать такой запрос: sql_q = "SELECT Tabl_1_id,control FROM Tabl_1,Tabl_3 WHERE ((Tabl_1_id=55)OR(Tabl_1_id=56)) and ((Tabl_3_id=1)OR(Tabl_3_id=3));" Но я явно что то недомудрил. Вместо 2х строк я получаю 4. Для каждого Tabl_1_id я получаю все controlы соответствующие каждому из control_id. Еще пробывал такой запрос: SELECT t1.Tabl_1_id,t3.control FROM Tabl_1 t1 INNER JOIN Tabl_2 t2 ON t1.Tabl_2_id=t2.Tabl_2_id INNER JOIN Tabl_3 t3 ON t3.Tabl_3_id=t2.Tabl_3_id WHERE ((t3.Tabl_3_id=3)OR(t3.Tabl_3_id=1)) and ((t1.Tabl_1_id=1)OR(t1.Tabl_1_id=2)); Вообще ничего не возвращает... Как мне исправится ? Как сделать такой запрос коректно ? С уважением. Ворон. |
Немного непонятно при чём тут массив norm_id.
Зачем ограничения WHERE ((t3.Tabl_3_id=3)OR ... если нужно просто правильную выборку сделать? Попробуй сделать два простых работающих примера и потом их соединять. Можно попробовать LEFT JOIN. |
Попробу
|
Может так
Может проще сразу увязать все таблицы и отобрать по norm_id?
Что-то типа этого... select t3.control,t1.tabl_1_id from table1 t1, table2 t2, table3 t3 where t1.tabl_2_id=t2.tabl_2_id and t2.tabl_3_id=t3.tabl_3_id and t1.norm_id in (1,2) ,где (1,2) - массив norm_id |
Попробуй написать запрос не весь сразу. а частями......т.е. посмотри как работает выборка 1-ой таблицы, и 2-ой, получи нужные записи, потом цепляй третию табличку..... можно повозиться с созданием представлений(View)....
|
2Avaf:
Сейчас попробую. 2Novoross: Отдельно запросы работают. Код:
sql_q = "SELECT control FROM Tabl_3 WHERE (Tabl_3_id=1)OR(Tabl_3_id=3);"Цитата:
Естественно все WHERE составляются в программе. Цитата:
Сейчас попробую LEFT JOIN |
Попробовал такой запрос с LEFT JOIN
Код:
SELECT control FROM Tabl_3 WHERE ((Tabl_3_id=3)OR(Tabl_3_id=1)) LEFT JOIN Tabl_1_id FROM Tabl_1 WHERE ((Tabl_1_id=1)OR(Tabl_1_id=2)); |
2Raven B.
с LEFT JOIN'ом конструкция в принципе неверная а вот вариант Avaf'а вполне работоспособный по крайней мере выдаёт то, что ты хотел судя по вопросу |
Не поленился создать базу с тремя таблицами.
Набросал SQL: SELECT Tabl_3.control, Tabl_1.Tabl_1_id FROM Tabl_3 LEFT JOIN Tabl_2 ON Tabl_2.Tabl_3_id=Tabl_3.Tabl_3_id LEFT JOIN Tabl_1 ON Tabl_1.Tabl_2_id=Tabl_2.Tabl_2_id WHERE Tabl_1.norm_id=1 У меня работает. :cool: |
А у меня нет. =(
За то заработал такой запрос Код:
sql_q = "SELECT ph_f_control_comp_t.ph_f_control_comp_id,control_t.control" |
| Часовой пояс GMT +4, время: 04:08. |
Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.