![](/img/trans.png)
[英]I want to use two queries into one using a column from first query in the second one in 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.