簡體   English   中英

兩個MySQL查詢合二為一,第二個查詢基於第一個查詢

[英]Two MySQL queries in one, with the second query based on first query

我正在努力解決這個問題。

我有一個名為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查詢中,這樣我還可以限制結果以創建頁面系統,以便所有結果都不在單個頁面上?

您可以選擇在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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM