我正在努力解决这个问题。
我有一个名为customers的表,还有一个名为sales的表。我希望能够列出例如2010年12月31日及之前销售的所有客户 - 但如果是2010年12月31日之后的销售,则同时排除客户。
目前我有
SELECT * FROM sales WHERE date <= '2010-12-31 23:59:59' ORDER BY sale_id DESC
在我的设定日期或之前选择销售。
然后我有另一个查询
SELECT * FROM sales WHERE customer_id='$result1[customer_id]' AND date >= '2010-12-31 23:59:59'
现在,使用原始查询中的customer_id值查找销售额,以查找在我的搜索日期之后哪些客户有销售。然后,如果第二个查询返回结果,则使用变量,例如..
$query2 = mysql_db_query($dbname, "SELECT * FROM sales WHERE customer_id='$r1[customer_id]' AND date >= '2010-12-31 23:59:59'");
$counted = mysql_num_rows($query2);
if($counted > 0){
$hidesale="do";
}
停止原始查询显示结果。
然而,这显然可能需要一些时间,因为它需要在2010年12月31日之前选择每次销售,然后在该销售下进行第二次查询以找出它,如果同一客户有任何未来的销售确定是否应该显示
是否可以将上述内容纳入单个MySQL查询中,这样我还可以限制结果以创建页面系统,以便所有结果都不在单个页面上?
答案 0 :(得分:2)
您可以选择在2010-12-31之前销售但2010-12-31之后没有任何销售的客户,使用下面的NOT EXISTS
SELECT * FROM sales s1 WHERE date <= '2010-12-31 23:59:59'
AND NOT EXISTS(SELECT customer_id FROM sales s2
WHERE s2.customer_id = s1.customer_id
date > '2010-12-31 23:59:59')
ORDER BY sale_id DESC
或者您可以使用LEFT JOIN解决方案
SELECT s1.*
FROM sales s1
LEFT JOIN sales s2
ON (s1.customer_id = s2.customer_id AND s2.date > '2010-12-31 23:59:59')
WHERE s1.date <= '2010-12-31 23:59:59'
AND s2.customer_id IS NULL
ORDER BY s1.sale_id DESC
为了加快速度,您可以使用
索引customer_id列和日期列以及sale_id列CREATE INDEX sales_customer_id_index ON sales(customer_id);
CREATE INDEX sales_date_index ON sales(date);
CREATE INDEX sales_sale_id_index ON sales(sale_id);