2013-10-09 242 views
2

我有2個SQL查詢時,首先選擇從基於區域和類別訂購MySQL查詢結果

它的一個傢俱店的數據庫產品,而這種查詢是餐桌。

SELECT p.id, 
    p.product_name, 
    p.range_name, 
    p.pic_url, 
    p.hits, 
    p.manufacturer, 
    p.standard_price, 
    p.sale_price, 
    p.offer_price, 
    p.discount, 
    p.display_manufacturer, 
    p.display_price, 
    p.visible, 
    p.display_model_results, 
    p.model, 
    p.subcat, 
    p.disable_options, 
    p.request_price, 
    p.corner_flag, 
    cf.flag_name, 
    cf.flag_url, 
    cf.flag_description, 
    p.display_model, 
    p.offer_status, 
    p.disable_options_results, 
    p.added_timestamp, 
    p.about, 
    p.keywords 
FROM products p, 
    corner_flags cf 
WHERE (p.area = 'Dining Room Furniture' 
     OR p.additionarea = 'Dining Room Furniture') 
    AND (p.subcat = 'Dining Tables' 
      OR p.additionsubcat = 'Dining Tables') 
    AND p.sale_price = '' 
    AND p.visible = '1' 
    AND p.corner_flag = cf.flag_id 
    AND (p.sale_price = '' 
      OR p.offer_price = '0') 
    AND p.visible = '1' 
ORDER BY (p.hits) DESC 

每一個產品在產品表卻增加了1。這是在第一次確定,但現在新的產品總是在列表的底部,如果客戶決定訂購看場「命中」時結果受歡迎程度。

我們有跟蹤我們的網站做出這樣寫道:香港專業教育學院查詢算一個特定的產品有多少次是視圖,在過去的2周,例如每點擊另一個表。

SELECT Count(*) AS total, 
    vtp.product_id 
FROM visitor_tracking_pages vtp, 
    products p 
WHERE vtp.product_id = p.id 
    AND p.subcat = 'Dining Tables' 
    AND p.visible = '1' 
    AND vtp.last_click >= '1380153600' 
GROUP BY vtp.product_id 
ORDER BY total DESC 

該查詢給出的產品ID,並在過去兩週收到的總命中。

我只是需要一種方法來這兩個查詢合併成一個。顯然不是每個產品都會在過去的兩週內被查看過,所以id需要一種返回0的方式,如果這有什麼不同?

伊夫看着各種聯接但林不熟悉如何寫他們。

你任何幫助,不勝感激!

回答

0

試試這個

SELECT p.id, 
    p.product_name, 
    p.range_name, 
    p.pic_url, 
    p.hits, 
    p.manufacturer, 
    p.standard_price, 
    p.sale_price, 
    p.offer_price, 
    p.discount, 
    p.display_manufacturer, 
    p.display_price, 
    p.visible, 
    p.display_model_results, 
    p.model, 
    p.subcat, 
    p.disable_options, 
    p.request_price, 
    p.corner_flag, 
    cf.flag_name, 
    cf.flag_url, 
    cf.flag_description, 
    p.display_model, 
    p.offer_status, 
    p.disable_options_results, 
    p.added_timestamp, 
    p.about, 
    p.keywords, 
    IFNULL(vtp.last_two_week_hits, 0) as last_two_week_total_hits 
FROM corner_flags cf INNER JOIN products p 
    ON cf.flag_id = p.corner_flag 
    LEFT JOIN 
     (SELECT v.product_id as product_id,Count(*) as last_two_week_hits 
      FROM visitor_tracking_pages v 
      WHERE v.last_click >= '1380153600' group by v.product_id 
     ) as vtp ON vtp.product_id = p.id 
WHERE p.visible = '1' AND (p.area = 'Dining Room Furniture' 
     OR p.additionarea = 'Dining Room Furniture') 
    AND (p.subcat = 'Dining Tables' 
      OR p.additionsubcat = 'Dining Tables') 
    AND (p.sale_price = '' 
      OR p.offer_price = '0') 
ORDER BY last_two_week_total_hits DESC 
+0

請解釋您所做的更改以及您的更改爲什麼會解決OP的問題。 – Bucket

+0

我在選擇語句中加入此 (SELECT COUNT(*)FROM VTP visitor_tracking_pages WHERE = vtp.product_id p.id AND vtp.last_click> = '1380153600' ),如通過我last_two_week_hits 並且爲了添加last_two_week_hits –

+0

感謝您的支持,它就像我想要的那樣工作! 問題是查詢平均需要38-42秒才能返回結果? – Ashley

1

我覺得這個解決您的問題,RIGHT JOIN:

SELECT COUNT(*) AS total, p.id as product_id 
FROM visitor_tracking_pages vtp RIGHT JOIN products p ON p.id=vtp.product_id 
WHERE p.SUBCAT = 'Dining Tables' AND p.visible = '1' AND (vtp.last_click >= '1380153600' or vtp.last_click IS NULL) 
GROUP BY p.id 
ORDER BY total DESC 

的右(或左)JOIN執行標準JOIN,就像在查詢你寫,然後將在所有行右(或左)表,表示不匹配的連接。

要結合您發佈的兩個查詢,你可以做到這一點查詢

SELECT p.id, p.product_name, p.range_name, p.pic_url, p.hits, p.manufacturer, p.standard_price, p.sale_price, p.offer_price, p.discount, p.display_manufacturer, p.display_price, p.visible, p.display_model_results, p.model, p.SUBCAT, p.disable_options, p.request_price, p.corner_flag, cf.flag_name, cf.flag_url, cf.flag_description, p.display_model, p.offer_status, p.disable_options_results, p.added_timestamp, p.about, p.keywords 
FROM products p, corner_flags cf LEFT JOIN visitor_tracking_pages vtp ON vtp.product_id=p.id 
WHERE (p.AREA='Dining Room Furniture' OR p.AdditionAREA='Dining Room Furniture') AND (p.SUBCAT='Dining Tables' OR p.AdditionSUBCAT='Dining Tables') AND p.sale_price='' AND p.visible='1' AND p.corner_flag = cf.flag_id AND (p.sale_price= '' OR p.offer_price = '0') AND p.visible='1' 
AND (vtp.last_click >= '1380153600' or vtp.last_click IS NULL) 
GROUP BY p.id 
ORDER BY COUNT(*), p.hits DESC 

我知道這是不是一個完美的方式,因爲規範地允許在字段列表中唯一字段是在GROUP BY提到的那些子句,但它起作用,並且您可以在ORDER BY子句中使用COUNT(*)。

另一種方式做你需要的是建立與我寫的第一個查詢視圖,例如* view_order *,然後用它作爲一個數字,以避免使用GROUP BY各式各樣的問題,與此查詢:

SELECT p.id, p.product_name, p.range_name, p.pic_url, p.hits, p.manufacturer, p.standard_price, p.sale_price, p.offer_price, p.discount, p.display_manufacturer, p.display_price, p.visible, p.display_model_results, p.model, p.SUBCAT, p.disable_options, p.request_price, p.corner_flag, cf.flag_name, cf.flag_url, cf.flag_description, p.display_model, p.offer_status, p.disable_options_results, p.added_timestamp, p.about, p.keywords 
FROM products p, corner_flags cf JOIN view_order vtp ON vtp.product_id=p.id 
WHERE (p.AREA='Dining Room Furniture' OR p.AdditionAREA='Dining Room Furniture') AND (p.SUBCAT='Dining Tables' OR p.AdditionSUBCAT='Dining Tables') AND p.sale_price='' AND p.visible='1' AND p.corner_flag = cf.flag_id AND (p.sale_price= '' OR p.offer_price = '0') AND p.visible='1' 
ORDER BY vtp.totale, p.hits DESC 
0

感謝所有幫助!

拉維 - 您的優化方面的工作,但由於某種原因停止恢復,在過去14天以來的hadnt鑑於產品。

在最後,我終於想出的工作溶液。

如果你看到任何進一步的改進,雖然,讓我知道:)

我創建了一個新的表名爲popular_products並用新的命中計數寫了一個腳本來填充每天都在該表(通過cron作業)從查詢visitor_tracking_pages表。

TRUNCATE TABLE刪除前一天的結果,然後再添加新的結果。

$timestamp = strtotime("-2 week"); 

mysql_query("TRUNCATE TABLE `popular_products`"); 

$result = mysql_query("SELECT COUNT(*) AS total, product_id 
FROM visitor_tracking_pages vtp 
WHERE vtp.product_id != '' AND vtp.last_click >= '$timestamp' 
GROUP BY product_id"); 

while($row = mysql_fetch_array($result)){ 

mysql_query("INSERT INTO popular_products (product_id, total_views) 
VALUES ('$row[1]','$row[0]')"); 

} 

這樣就允許我將它添加到結果中,而不需要運行查詢。

在過去2周內沒有查看的產品返回爲NULL,這很好。

SELECT p.id, 
    p.product_name, 
    p.range_name, 
    p.pic_url, 
    p.hits, 
    p.manufacturer, 
    p.standard_price, 
    p.sale_price, 
    p.offer_price, 
    p.discount, 
    p.display_manufacturer, 
    p.display_price, 
    p.visible, 
    p.display_model_results, 
    p.model, 
    p.subcat, 
    p.disable_options, 
    p.request_price, 
    p.corner_flag, 
    cf.flag_name, 
    cf.flag_url, 
    cf.flag_description, 
    p.display_model, 
    p.offer_status, 
    p.disable_options_results, 
    p.added_timestamp, 
    p.about, 
    p.keywords, 
    (SELECT pp.total_views 
     FROM popular_products pp 
     WHERE pp.product_id = p.id 
    ) AS total_views 
FROM products p, corner_flags cf 
WHERE p.visible='1' 
    AND (p.AREA='Dining Room Furniture' OR p.AdditionAREA='Dining Room Furniture') 
    AND (p.SUBCAT='Dining Tables' OR p.AdditionSUBCAT='Dining Tables') 
    AND p.corner_flag = cf.flag_id 
    AND p.sale_price= '' 
ORDER BY ABS(total_views) DESC 
+0

嘿阿什利我再次編輯我的查詢來顯示產品,即使它在過去兩週內有0次點擊。嘗試一下。 –

+0

謝謝拉維!我對你有一個新的挑戰:) – Ashley

0

有什麼辦法可以進一步過濾點擊數? ......基本上有些訪問者會在產品之間來回切換多次,這顯示產品會收到更多的意見。

在visitor_tracking_pages表中查詢產品的查詢顯示其總共查看了7次,但實際上只查看了5位唯一訪客。

SELECT ip_address, product_id 
FROM `visitor_tracking_pages` 
WHERE `product_id` = '1562805' 
AND `last_click` >= '1380153600' 

| ip_address | product_id | 
----------------------------- 
| 192.168.0.1 | 1562805 | 
| 192.168.0.1 | 1562805 | 
| 192.168.0.2 | 1562805 | 
| 192.168.0.3 | 1562805 | 
| 192.168.0.4 | 1562805 | 
| 192.168.0.1 | 1562805 | 
| 192.168.0.5 | 1562805 | 
-----------------------------