SQL语句仅返回连接表中也存在的行

时间:2014-03-24 13:58:17

标签: mysql sql

我无法弄清楚如何为此形成一个合适的SQL语句。我希望从products表中获取每一行,但如果其他表中的某些值大于某些值,则过滤结果。

我当前的语句返回我想要正确过滤的每一行,但我无法使其过滤掉当前结果并打印其他所有内容

SELECT p.*
FROM products p
LEFT JOIN orders o ON o.product_id = p.product_id AND order_date < somedate 
WHERE o.id IS NULL

如果订单表列order_date小于给定日期,我希望它打印除过滤行之外的整个产品表,

编辑:感谢所有帮助过我的人!

6 个答案:

答案 0 :(得分:4)

SELECT p.*
FROM products p
LEFT JOIN orders o ON o.product_id = p.product_id AND order_date < somedate and o.id IS NULL

答案 1 :(得分:3)

SELECT p.*
FROM products p
LEFT JOIN orders o ON o.product_id = p.product_id 
WHERE o.id IS NULL AND order_date < somedate 

只需将条件移至WHERE部分

即可

答案 2 :(得分:3)

每当您需要过滤结果集时,请在WHERE子句中提及条件。 每当您需要过滤要加入的表时,请在JOIN条件中提及条件。如果它是一个INNER JOIN,它会有效。但是在LEFT OUTER and RIGHT OUTER JOIN的情况下情况有很大不同。

所以查询变为: -

SELECT p.*
FROM products p
LEFT JOIN orders o ON o.product_id = p.product_id
WHERE o.id IS NULL
AND order_date < somedate

答案 3 :(得分:2)

你认为太复杂了。您需要来自不存在特定订单的表产品的记录。所以在你的where子句中说NOT EXISTS。

SELECT *
FROM products
WHERE NOT EXISTS
(
  SELECT *
  FROM orders
  WHERE product_id = products.product_id 
  AND order_date < somedate 
);

(你可以用外连接来解决这个问题,在我的眼中看起来有点古怪。请注意:当外连接时,不要在where子句中使用外连接表字段,因为它们将为null当然是外部联合记录。)

答案 4 :(得分:1)

尝试:

SELECT p.*
FROM products p
LEFT JOIN orders o ON o.product_id = p.product_id 
WHERE o.id IS NULL AND order_date < somedate 

答案 5 :(得分:1)

打印“其他所有内容”并不仅仅是对此查询的否定。重点是products表,大概你不想重复。您可以使用except来实现此目的。这是另一种方法:

SELECT p.*
FROM products p
WHERE NOT EXISTS (select 1
                  from orders o
                  where o.product_id = p.product_id AND
                        o.order_date >= somedate
                 );

这将返回在给定日期之后或之后没有订单的产品。

请注意,这将返回没有订单的产品。我不清楚如何处理这些问题。