нуб SQL запрос

freako

Походу в нем ошибка:
SELECT banners_counter.*, banners.active, banners.id as banner_id
FROM banners, banner2user, banners_counter, banner2counter, banner2category
WHERE
banner2category.category_id=2 AND
banner2user.user_id=1 AND
banners_counter.id=banner2counter.counter_id AND
banner2counter.banner_id=banners.id AND
banner2category.banner_id=banners.id AND
banner2user.banner_id=banners.id
Надо: выбрать счетчики ( banners_counter) и ID,active баннера
для тех баннеров, у которых
  user_id=1 и category_id=2
Связь категорий и баннеров в таблице banner2category
счетчиков и баннеров в таблице banner2counter
юзеров и баннеров banner2user
сами баннеры в banners
Синтаксически всё верно но выдаёт что то не то. не пойму , где то тут нужен видимо DISTINCT?

Teteshnik

слишком много? мало?

freako

closed

Teteshnik

ну так выведи все таблицы *. отсортируй по этому каунтеру, возьми повторяющийся, выбери все только с этим каунтером и посмотри где ты что недоучел

freako

Да не, оказалось запрос то верный) В одной из таблице немного не те значения были вставлены - надо будет на ней первичный ключ создать

Ve9443

на будущее. Используй join.

freako

В чем его преимущество перед вышеуказанным запросом?... оно быстрее работает или в чем то другом?

Ve9443

Наглядность, скорость, поддержка и развитие разработчиком и все остальное читай на сайте майкрософта, если интересно.

freako

разработчиком кого?
MS тут причем? я на оркале прогаю

Ve9443

ну про оракл читай где нить еще.

evgen5555

А, ну да, на оракле конешно можно :grin:

Andbar

у тебя в where каша из условий, чтобы разобраться в ней, придётся потратить несколько минут. Тем более, что ты не используешь короткие имена таблиц, а значит на считывание длинных имён таблиц будет уходить каждый раз гораздо больше времени (впрочем, их не только для этого придумали).
Дополнительное удобство открывается с outer join'ом, он явно нагляднее нежели (+ да и full join плюсиком не изобразишь

doublemother

SELECT banners_counter.*, banners.active, banners.id as banner_id
FROM banners, banner2user, banners_counter, banner2counter, banner2category
WHERE
banner2category.category_id=2 AND
banner2user.user_id=1 AND
banners_counter.id=banner2counter.counter_id AND
banner2counter.banner_id=banners.id AND
banner2category.banner_id=banners.id AND
banner2user.banner_id=banners.id

SELECT bc.*, b.active, b.id as banner_id
FROM banners b
INNER JOIN banner2category b2ca ON (b.id = b2ca.banner_id)
INNER JOIN banner2user b2u ON (b.id = b2u.banner_id)
INNER JOIN banner2counter b2co ON (b.id = b2co.banner_id)
INNER JOIN banners_counter bc ON (b2co.counter_id = bc.id)
WHERE
b2ca.category_id=2
AND b2u.user_id=1

Вот так это должно было выглядеть по-человечески. Не уверен, обязательно ли ораклу нужно упоминание INNER, но в любом случае — так он более гарантированно поймёт, как джоинить таблицы. А то ты своими AND'ами и крышу анализатору сорвать можешь. Не факт, конечно, но небольшие шансы у тебя есть.

freako

Для читабельности да, впредь буду писать именно так. а насчет производительности тут знающие люди вот что говорят:
"писать через inner join или в where - всё равно
а вот если left join, то в оракле вообще рекомендуется через where писать, а не left join"

mbolik1

"писать через inner join или в where - всё равно
а вот если left join, то в оракле вообще рекомендуется через where писать, а не left join"
Это было справедливо только для 9-ки.

Vantucha

в десятке тоже было до какого-то патча
мне не доводилось сталкиваться, но на скл.ру можно найти
а вот с ситуациями, когда с анси не фиксируется нормальный план выполнения я несколько раз встречался
а с плюсиками ок вроде всегда было
правда не так читаемо, это да
Оставить комментарий
Имя или ник:
Комментарий: