Имя: Пароль:
IT
Админ
Подскажите по SQL запросу
,
0 Супер король
 
26.03.15
11:24
вот запрос. Не пойму как он работает. Точнее почему он работает. Не вижу связей таблицы "c" с другими таблицами. Как он узнает какие данные надо выбрать из таблицы "с"?

SELECT i.* , c.title, m.id
FROM c, m, i
WHERE m.item_id = i.id
AND i.published =1
AND (
m.addr_hash = ''
)
GROUP BY i.id
LIMIT 1000
1 Ёпрст
 
26.03.15
11:27
обычный inner join
2 Ёпрст
 
26.03.15
11:27
че тебя там смущает ?
3 Ёпрст
 
26.03.15
11:28
даже не так, там кросс джоин таблички с с иннер джоином между табличками m, i
4 shuhard
 
26.03.15
11:29
(0) это декартово произведение, все строки с попадут в выборку
5 Ненавижу 1С
 
гуру
26.03.15
11:29
вот это SELECT i.* , c.title, m.id
и это GROUP BY i.id
странно

но я не специалисту по данному диалекту
6 Ёпрст
 
26.03.15
11:34
(5) да это не странно, это не работает.
Разве что, sqlite такой синтаксис "прощает", по крайней мере, в 1sqlite это так
7 фобка
 
26.03.15
11:37
(0) из таблицы "c" запрос берет все данные
8 Супер король
 
26.03.15
11:38
(4) Вот и я думал что все строки попадут. А получается что не все
9 Супер король
 
26.03.15
11:39
вообще из С попадут все строки и умножатся на каждую строку из других таблиц?
10 фобка
 
26.03.15
11:44
(9) да, другие таблицы связаны по условию where
11 фобка
 
26.03.15
11:45
Эта связь уже inner join
12 Ёпрст
 
26.03.15
11:49
(8) см (3)
твой запрос эквивалентен

SELECT i.* , c.title, m.id
FROM c
cross join m
inner join i on m.item_id = i.id
                 AND i.published =1
                 AND m.addr_hash = ''

GROUP BY i.id
LIMIT 1000
13 фобка
 
26.03.15
11:53
Select ... from i Cross join c
14 фобка
 
26.03.15
11:53
Inner join m
15 фобка
 
26.03.15
11:54
Хотя возможно (12) и 13+14 эквивалентны
16 Супер король
 
26.03.15
11:58
То есть смысла выбирать таблицу С вообще нет в этом запросе?
17 Супер король
 
26.03.15
11:59
(6) а что странного в группировке?
18 фобка
 
26.03.15
12:05
(16) почему это? На каждый title привязаны значения из других таблиц
(17) в группировке нужно указать все поля иначе субд поругается
19 shuhard
 
26.03.15
12:07
(16) бессмысленный вопрос, запрос возвращает предсказуемый результат, накуя он нужен форуму не ведомо
20 фобка
 
26.03.15
12:09
Хотя на выходе если субд простила группировку останется только id. Значит ненужен
21 DrZombi
 
гуру
26.03.15
12:21
(0) >>> Как он узнает какие данные надо выбрать из таблицы "с"

Вот этот вопрос самый бесполезный.

Я бы поинтересовался, что за Таблица C. Название какое-то фейковое.

Да и сам запрос без связей, так что Избыточность информации там на высоте :)
22 DrZombi
 
гуру
26.03.15
12:24
+(21)  Судя по тому, что в условии нет работы с таблицей "С". То там будут все данные со всеми данными из таблиц "m" и "i" :)
23 rsv
 
26.03.15
12:25
(0)  Limit  Постгри штоль ?
24 DrZombi
 
гуру
26.03.15
12:27
+(0) Limit 1000
http://myrusakov.ru/sql-limit.html

По сути, запрос не отражает полноты информации. Если к примеру в таблице "C" окажется 500 записей, то есть большая вероятность не увидеть всю информацию, т.к. из таблиц  "m" и "i" информация будет удваиваться :)
25 DrZombi
 
гуру
26.03.15
12:28
+(0)На кого учишься? Что за тестовое задание выполняешь? :)
Какую книжку читаешь? ;)
26 Супер король
 
26.03.15
12:32
(25) На радиоэлектронщика.
Задание не тестовое, а практическое по лаботаторке.
Читаю Кухлинга.
27 rsv
 
26.03.15
12:35
(26) Лучше ANSI  т.к. он не зависим от СУБД.
28 rsv
 
26.03.15
12:36
+(27) А опосля Расширения MySQL к ANSI SQL92
29 Ёпрст
 
26.03.15
12:38
(16) в этом - да