两个MySQL查询合二为一,第二个查询基于第一个查询

时间:2014-01-17 04:09:49

标签: mysql

我正在努力解决这个问题。

我有一个名为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查询中,这样我还可以限制结果以创建页面系统,以便所有结果都不在单个页面上?

1 个答案:

答案 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);