mysql — SQL / PHP Как я могу отфильтровать это с помощью LEFT JOIN?

Эта база данных является очень базовой концепцией для магазин видеопроката. База данных отображается с использованием PHP (и HTML, CSS, начальной загрузки и т. Д.).

я имею три столы:

tl_dvd: который содержит основную информацию о DVD, продолжительности, имени, языке и т. д.

tl_dvd

tl_order: в котором содержится имя человека, который арендовал фильм, и начальная дата.

tl_order

tl_client: который на самом деле не имеет отношения к моему вопросу / проблеме, а просто содержит имя и фамилию клиента.

Когда я нахожусь на странице заказа, он отображает все заказы, которые в данный момент выполняются. У меня есть одна колонка называется returned в tl_order с крошечным где 0 означает не вернулся а также 1 выступает за возвращение.

Там есть кнопка, которая говорит:Теруг Гебрахт‘(=’ полученный ответ ‘на английском языке), который установит выбранный порядок на 1. В tl_order отображаются только те заказы, которые еще не были возвращены (returned установить на 0). В конце SQL-запроса я установил что-то вроде ... AND returned = 0';

Вот часть, где я должен использовать LEFT (OUTER?) JOIN, Если заказ не вернулся (это означает, что returned все еще включен 0 в tl_order) DVD не должен появляться в моем tl_dvd (Думайте об этом, как будто у нас есть только одна DVD-копия для каждого фильма). Я пробовал это LEFT JOINв tl_dvd:

'SELECT * FROM tl_dvd LEFT JOIN tl_order WHERE tl_order.returned = 1';

Ломает мою страницу с ошибкой 500

'SELECT * FROM tl_dvd LEFT JOIN tl_order ON tl_order.returned = 1';

Не дает мне ошибки, но спамит каждый заголовок как 3 раза.

Может кто-нибудь объяснить мне, как решить эту проблему или что я делаю неправильно?

2

Решение

Проблема с вашими запросами в том, что вы не указываете, как таблицы должны быть объединены (какие столбцы для объединения), и поэтому он возвращает все из обеих таблиц.

Попробуй это:

select
*
from
tl_dvd left join tl_order on (tl_dvd.titel=tl_order.titel)
where
tl_order.returned = 1
0

Другие решения

Вы не можете четко объяснить или привести пример того, что вы хотите в результате запроса. Но из ваших примеров вы можете захотеть

SELECT *  FROM tl_dvd
LEFT JOIN tl_order
ON tl_dvd.titel = tl_order.titel
WHERE tl_order.returned = 1

OUTER JOIN без ON не является стандартным SQL, но MySQL обрабатывает отсутствие ON в INNER и OUTER JOIN как ON 1=1, что в любом случае эквивалентно CROSS JOIN.

Но не похоже, что вы действительно хотите СЛЕДУЮЩЕЕ, а не (ВНУТРЕННЕЕ). LEFT JOIN возвращает (INNER) строки JOIN плюс несопоставленные строки левой таблицы, расширенные нулями. Таким образом, здесь, кроме строки для каждого заказа на DVD, вы получаете строку для каждого заказанного DVD с информацией о заказе, равной нулю. Поскольку «если заказ не вернулся […], DVD не должен появляться», кажется, говорит, что вы не хотите эти дополнительные строки. Вы бы хотели, чтобы вышесказанное без «ВЛЕВО» или эквивалентно (но менее четко)

SELECT *  FROM tl_dvd
CROSS JOIN tl_order
WHERE tl_dvd.titel = tl_order.titel
AND tl_order.returned = 1
0

Вы можете переписать запрос к внутреннему соединению пользователя, как показано ниже:

SELECT * FROM tl_dvd INNER JOIN tl_order ON
tl_dvd.id=tl_order.id //replace the id with the id you would like to join
WHERE tl_order.returned = 1
0
По вопросам рекламы [email protected]