Эта база данных является очень базовой концепцией для магазин видеопроката. База данных отображается с использованием PHP (и HTML, CSS, начальной загрузки и т. Д.).
я имею три столы:
tl_dvd: который содержит основную информацию о DVD, продолжительности, имени, языке и т. д.
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 раза.
Может кто-нибудь объяснить мне, как решить эту проблему или что я делаю неправильно?
Проблема с вашими запросами в том, что вы не указываете, как таблицы должны быть объединены (какие столбцы для объединения), и поэтому он возвращает все из обеих таблиц.
Попробуй это:
select
*
from
tl_dvd left join tl_order on (tl_dvd.titel=tl_order.titel)
where
tl_order.returned = 1
Вы не можете четко объяснить или привести пример того, что вы хотите в результате запроса. Но из ваших примеров вы можете захотеть
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
Вы можете переписать запрос к внутреннему соединению пользователя, как показано ниже:
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