С Новым годом! Форум программистов, компьютерный форум, киберфорум
MySQL
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.59/34: Рейтинг темы: голосов - 34, средняя оценка - 4.59
 Аватар для ostgals
886 / 681 / 101
Регистрация: 23.01.2009
Сообщений: 1,582

LEFT JOIN с фильтрацией правой таблицы

07.12.2012, 17:41. Показов 6500. Ответов 4

Студворк — интернет-сервис помощи студентам
Добрый день, очень нужен совет.

Задача: вывести названия аукционов из одной таблицы и количество сделанных ставок + минимальную ставку из другой таблицы. Но (ключевой момент!) при этом из таблицы ставок (bids) должны быть использованы только ставки с условием bids.banned=0

Первое решение, которое пришло в голову:
SQL
1
2
3
4
5
6
7
8
9
10
SELECT
   auctions.title,
   COUNT(bids.id) AS bid_count,
   MIN(bids.price) AS min_bid
FROM
   auctions
   LEFT JOIN bids ON bids.auction = auctions.id
WHERE
   bids.banned = 0
   AND auctions.closed = 0
Оно работает не так как нужно, потому что из-за условия bids.banned = 0 не выводятся аукционы, для которых ставки в таблице bids не существуют (иными словами, как бы пропадает преимущество left join).

У меня есть два рабочих решения. Одно - с использованием подзапроса:
SQL
1
2
3
4
5
6
7
8
9
SELECT
   auctions.title,
   COUNT(bids.id) AS bid_count,
   MIN(bids.price) AS min_bid
FROM
   auctions
   LEFT JOIN (SELECT * FROM bids WHERE banned = 0) bids ON bids.auction = auctions.id
WHERE
   auctions.closed = 0
Второе - с подсовыванием фильтра в ON:
SQL
1
2
3
4
5
6
7
8
9
SELECT
   auctions.title,
   COUNT(bids.id) AS bid_count,
   MIN(bids.price) AS min_bid
FROM
   auctions
   LEFT JOIN bids ON bids.auction = auctions.id AND bids.banned = 0
WHERE
   auctions.closed = 0
Собственно вопрос: какой вариант лучше?
Доки по mysql категорически не советуют второй вариант, но он быстрее примерно в два раза.
Или есть еще какие-то способы решить задачу?

Добавлено через 15 минут
Забыл: в листингах в каждом запросе надо добавить
SQL
1
GROUP BY auctions.id
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.12.2012, 17:41
Ответы с готовыми решениями:

Запросы RIGHT JOIN и LEFT JOIN в чём различие?
Добрый день! Чем отличаются запросы RIGHT JOIN и LEFT JOIN, если они выдают один и тот же результат?

Переделать запрос LEFT JOIN -> INNER JOIN
Доброго времени суток, помогите переделать запрос с использованием LEFT JOIN на INNER JOIN SELECT Студент.Фамилия FROM Студент LEFT...

LEFT JOIN три таблицы
Люди добрые помогите оформить такую вещь. Есть страница новости, данные к которой: name , user и др. записаны в таблице с новостями. ...

4
 Аватар для Vovan-VE
13210 / 6599 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
07.12.2012, 18:05
ostgals,
MySQL
1
2
WHERE (`bids`.`id` IS NULL OR `bids`.`banned` = 0)
    AND ...
Добавлено через 1 минуту
Цитата Сообщение от ostgals Посмотреть сообщение
Второе - с подсовыванием фильтра в ON:
MySQL
1
ON bids.auction = auctions.id AND bids.banned = 0
Доки по mysql категорически не советуют второй вариант, но он быстрее примерно в два раза.
Почему не советуют? Ссылку, если можно.
Ведь не это ли истинное условие объединения: "только незабаненные ставки" ?
0
 Аватар для ostgals
886 / 681 / 101
Регистрация: 23.01.2009
Сообщений: 1,582
07.12.2012, 18:53  [ТС]
Vovan-VE, спасибо большое.

Если честно, я видел в доках по JOIN упоминание про псевдостроку со значениями NULL, но как-то не сообразил сразу, что это можно использовать и в моем случае.

Цитата про нежелательность использования ON для фильтрации попадалась мне дважды. Здесь и в каком-то русском вольном переводе. Именно в русском варианте интонация заявления была более категоричной, чем в первоисточнике, что и ввело меня в заблуждение.

Кликните здесь для просмотра всего текста
The conditional_expr used with ON is any conditional expression of the form that can be used in a WHERE clause. Generally, you should use the ON clause for conditions that specify how to join tables, and the WHERE clause to restrict which rows you want in the result set.


Вдогонку вопрос: насколько этот вариант будет совместим с остальными СУБД?
0
 Аватар для Vovan-VE
13210 / 6599 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
07.12.2012, 19:15
Цитата Сообщение от ostgals Посмотреть сообщение
The conditional_expr used with ON is any conditional expression of the form that can be used in a WHERE clause. Generally, you should use the ON clause for conditions that specify how to join tables, and the WHERE clause to restrict which rows you want in the result set.
ostgals, См. также "условие объединения vs условие выборки": Как запросом удалить строки из двух таблиц!

Цитата Сообщение от ostgals Посмотреть сообщение
Вдогонку вопрос: насколько этот вариант будет совместим с остальными СУБД?
В доке MySQL вроде бы пишется, где что отличается от стандарта SQL. Например, про CROSS JOIN по твоеё же ссылке:
In MySQL, JOIN, CROSS JOIN, and INNER JOIN are syntactic equivalents (they can replace each other). In standard SQL, they are not equivalent. INNER JOIN is used with an ON clause, CROSS JOIN is used otherwise.
Но всё равно, надо сам стандарт SQL читать иногда.
0
 Аватар для ostgals
886 / 681 / 101
Регистрация: 23.01.2009
Сообщений: 1,582
07.12.2012, 22:01  [ТС]
Цитата Сообщение от Vovan-VE Посмотреть сообщение
Но всё равно, надо сам стандарт SQL читать иногда.
Стандарт стандартом, но в конечном итоге мы имеем дела с его реализациями.
Без труда нашел идентичные примеры для Oracle и MSSQL - подход точно такой же, должно работать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.12.2012, 22:01
Помогаю со студенческими работами здесь

JOIN (или не JOIN?) - показать все записи только левой таблицы, дополнив значениями правой
Хочу вывести все записи одной таблицы, дополнив данными из других таблиц. При этом записи других таблиц не должны выводится полностью, а...

LEFT JOIN Запров в 3 таблицы одновременно
Вот вроде понимаю, а приминить не могу. Есть допустим 4 таблицы 1)kvart 2)metro 3)type 4)city в таблице kvart укажем ...

Несколько LEFT JOIN для одной и той же таблицы
Как правильно сделать 2 запроса LEFT JOIN в одну и ту же таблицу Есть такой код <!DOCTYPE html> <html> <body> ...

LEFT JOIN в подчиненной форме. Все записи из левой таблицы
Доброго дня! Друзья, есть три таблицы: Получатели, План, Выдачи. Получатели неизменны, есть всегда, одни и те же. --Различными...

Как записать Left Join (Right Join) при помощи Linq, используя fluent-синтаксис
Как записать Left Join (Right Join) при помощи Linq используя fluent - синтаксис? У меня есть подозрение что при помощи SelectMany,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru