gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 08:13:07 25 4
gpt4 key购买 nike

我正在为这个问题苦苦挣扎。

我有一个名为“客户”的表和一个名为“销售”的表。例如,我希望能够列出在 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 日之前的每笔销售,然后在该销售下运行第二个查询,以查明同一客户是否有任何 future 销售,以确定是否应显示它.

是否可以将上述内容放入单个 MySQL 查询中,这样我也可以限制结果以创建页面系统,以便所有结果都不在单个页面上?

最佳答案

您可以使用如下所示的 NOT EXISTS 来选择在 2010 年 12 月 31 日之前有销售但在 2010 年 12 月 31 日之后没有任何销售的客户

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

关于mysql - 两个 MySQL 查询合二为一,第二个查询基于第一个查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21177698/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com