Использование MySQL для возврата результатов с использованием LEFT JOIN, где одна из таблиц не содержит записи - PullRequest
0 голосов
/ 10 февраля 2012

Это немного случайный вопрос, и я делал это, используя несколько запросов в MySQL и немного PHP.

У меня есть запрос MySQL:

SELECT * 
FROM (reviews LEFT JOIN orders ON reviews.orderid = orders.orderid) 
LEFT JOIN customers ON orders.custid = customers.id 
WHERE customers.email = '$email'

, который возвращает все отзывы о товаре от конкретного клиента.

Я хотел бы знать структуру отдельного запроса, который бы возвращал все заказы клиента, которые еще не рассмотрены.То есть там, где нет записи в таблице отзывов для определенного ордерида.

Итак ...

SELECT * 
FROM orders LEFT JOIN customers ON orders.custid = customers.id 
WHERE customers.email = '$email'

... который вернет все заказы клиентов, но я тогда хочувозможно, использовать другое предложение WHERE и LEFT JOIN, чтобы теперь возвращались только orderid без соответствующих записей проверки.Я пытался найти то, что будет делать это в течение некоторого времени без какой-либо удачи.Ничто, похоже, не делает эту работу.

Как уже говорилось выше, мне удалось сделать это, используя комбинацию PHP / MySQL, однако, это не очень эффективно, поэтому я подумал, есть ли у кого-нибудь какие-либо предложения?

Заранее спасибо.

Райан

Ответы [ 5 ]

1 голос
/ 10 февраля 2012

вы пробовали это?

SELECT orders.* FROM orders 
LEFT JOIN customers ON orders.custid = customers.id
LEFT JOIN reviews ON reviews.orderid=orders.id
 WHERE customers.email = '$email' AND reviews.orderid IS NULL

это должно вернуть все не просмотренные заказы для клиента по электронной почте

1 голос
/ 10 февраля 2012
SELECT * 
FROM customers 
  JOIN orders 
    ON orders.custid = customers.id 
WHERE customers.email = '$email' 
  AND orders.orderid NOT IN 
        ( SELECT orderid FROM reviews )

... возможно

0 голосов
/ 10 февраля 2012

Это будет работать, но это может быть медленным.

SELECT * 
FROM orders 
LEFT JOIN customers 
  ON orders.custid = customers.id 
WHERE customers.email = '$email'
AND orders.orderid NOT IN (SELECT orderid FROM reviews)

Это было бы быстрее.

SELECT orders.orderid 
FROM orders 
LEFT JOIN customers 
  ON orders.custid = customers.id 
LEFT JOIN reviews
  ON reviews.orderid = orders.orderid
WHERE customers.email = '$email'
GROUP BY orders.orderid
HAVING count(reviews) = 0
0 голосов
/ 10 февраля 2012

Вы можете LEFT JOIN своих клиентов / заказов на reviews и выбирать строки без соответствующих review:

SELECT * 
FROM orders LEFT JOIN customers ON orders.custid = customers.id 
LEFT JOIN reviews ON reviews.orderid = orders.orderid
WHERE customers.email = '$email'
 AND reviews.orderid IS NULL
0 голосов
/ 10 февраля 2012

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

SELECT * 
FROM  orders a LEFT JOIN customers b ON a.custid = b.id 
WHERE b.email = '$email' AND
      a.orderid NOT IN (SELECT orderid FROM reviews)
...