IMHO.WS

IMHO.WS (http://www.imho.ws/index.php)
-   Программирование (http://www.imho.ws/forumdisplay.php?f=40)
-   -   Пмогите с SQl запросом. (http://www.imho.ws/showthread.php?t=94550)

Raven B. 21.10.2005 14:40

Пмогите с 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));

Вообще ничего не возвращает...

Как мне исправится ?
Как сделать такой запрос коректно ?

С уважением. Ворон.

EvroStandart 21.10.2005 15:57

Немного непонятно при чём тут массив norm_id.
Зачем ограничения WHERE ((t3.Tabl_3_id=3)OR ...
если нужно просто правильную выборку сделать?

Попробуй сделать два простых работающих примера и потом их соединять. Можно попробовать LEFT JOIN.

Novoross 21.10.2005 16:05

Попробу

Avaf 21.10.2005 16:08

Может так
 
Может проще сразу увязать все таблицы и отобрать по 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

Novoross 21.10.2005 16:09

Попробуй написать запрос не весь сразу. а частями......т.е. посмотри как работает выборка 1-ой таблицы, и 2-ой, получи нужные записи, потом цепляй третию табличку..... можно повозиться с созданием представлений(View)....

Raven B. 21.10.2005 18:54

2Avaf:
Сейчас попробую.
2Novoross:
Отдельно запросы работают.
Код:

sql_q = "SELECT control FROM Tabl_3 WHERE (Tabl_3_id=1)OR(Tabl_3_id=3);"
sql_q = "SELECT Tabl_1_id FROM Tabl_1 WHERE (Tabl_1_id=55)OR(Tabl_1_id=56);"

2EvroStandart:
Цитата:

EvroStandart:
Немного непонятно при чём тут массив norm_id.
С помощью масива norm_id я получаю из Tabl_1 нужные мне Tabl_1_id и Tabl_2_id. (WHERE (norm_id="1")OR(norm_id="1")OR(norm_id="1"))
Естественно все WHERE составляются в программе.
Цитата:

EvroStandart:
Зачем ограничения WHERE ((t3.Tabl_3_id=3)OR ...
если нужно просто правильную выборку сделать?
Согласен. вот пытаюсь разобратся как правильно.
Сейчас попробую LEFT JOIN

Raven B. 21.10.2005 22:22

Попробовал такой запрос с 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));
Синтаксически вроде бы все верно а на практике не работает =(

_Lynx_ 22.10.2005 00:14

2Raven B.
с LEFT JOIN'ом конструкция в принципе неверная

а вот вариант Avaf'а вполне работоспособный
по крайней мере выдаёт то, что ты хотел судя по вопросу

EvroStandart 22.10.2005 12:43

Не поленился создать базу с тремя таблицами.
Набросал 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:

Raven B. 23.10.2005 14:06

А у меня нет. =(
За то заработал такой запрос
Код:

sql_q = "SELECT ph_f_control_comp_t.ph_f_control_comp_id,control_t.control"
sql_q = sql_q & " FROM ph_f_control_comp_t, control_comp_t, control_t"
sql_q = sql_q & " WHERE Str(control_comp_t.control_id) = Str(control_t.control_id)"
sql_q = sql_q & " AND str(ph_f_control_comp_t.control_comp_id)=str(control_comp_t.control_comp_id)"
sql_q = sql_q & " AND ph_f_control_comp_t.norm_id = '" & veg & "'"

Так что проблема решена в любом случае.


Часовой пояс GMT +4, время: 04:08.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.