2010-03-26 81 views
1

我前段時間創建了一個凌亂的查詢來獲取產品代碼列表。我正在嘗試清理我的表格和我的代碼。我最近試圖重寫查詢,以便它更易於使用和理解。原始查詢的效果很好,但它需要多個搜索字符串才能執行一次搜索,因爲它使用了UNION,而且還有其他一些問題。我最近修改的查詢更容易理解,只需要一個搜索字符串,但返回的結果不同。基本上新的查詢將記錄留下,我想了解爲什麼以及如何解決它。這裏有兩個查詢(搜索字符串均爲空):重寫mysql查詢返回意想不到的結果,試圖找出原因

原始查詢:

$query = 'SELECT product_code FROM bus_warehouse_lots WHERE status=\'2\''.$search_string_1 
    .' UNION SELECT product_code FROM bus_po WHERE status=\'0\''.$search_string_2 
    .' UNION SELECT bus_warehouse_entries.new_product_code AS product_code FROM (bus_warehouse_entries LEFT JOIN bus_warehouse_transfers ON bus_warehouse_entries.picking_ticket_num=bus_warehouse_transfers.pt_number) LEFT JOIN bus_warehouse_lots ON bus_warehouse_entries.ebooks_lot_id=bus_warehouse_lots.id WHERE bus_warehouse_entries.type=\'6\' AND bus_warehouse_transfers.status=\'0\''.$search_string_3 
    .' UNION SELECT bus_contracts.main_product AS product_code FROM bus_contracts LEFT JOIN bus_warehouse_lots ON bus_contracts.main_product=bus_warehouse_lots.product_code WHERE bus_contracts.status=\'0\''.$search_string_4 
    .' UNION SELECT prod_id AS product_code FROM bus_products WHERE last_usage > \''.date('Y-m-d', strtotime('-12 months')).'\''.$search_string_5 
    .' ORDER BY product_code'; 

新查詢:

$query = 'SELECT bus_products.prod_id FROM bus_products' 
    .' LEFT JOIN (bus_warehouse_lots, bus_po, bus_warehouse_entries, bus_contracts) ON (' 
    .'bus_products.prod_id = bus_warehouse_lots.product_code' 
    .' AND bus_products.prod_id = bus_po.product_code' 
    .' AND bus_products.prod_id = bus_warehouse_entries.new_product_code' 
    .' AND bus_products.prod_id = bus_contracts.main_product)' 
    .' LEFT JOIN bus_warehouse_transfers ON' 
    .' bus_warehouse_entries.picking_ticket_num = bus_warehouse_transfers.pt_number' 
    .' WHERE (bus_products.last_usage > \''.date('Y-m-d', strtotime('-12 months')).'\'' 
    .' OR bus_warehouse_lots.status = \'2\'' 
    .' OR bus_po.status = \'0\'' 
    .' OR (bus_warehouse_entries.type = \'6\' AND bus_warehouse_transfers.status = \'0\')' 
    .' OR bus_contracts.status = \'0\')' 
    .$search_string_6 
    .' GROUP BY bus_products.prod_id' 
    .' ORDER BY bus_products.prod_id'; 
+0

我們可以得到一個搜索字符串的樣本嗎? – CogitoErgoSum 2010-03-26 16:31:49

+0

爲了測試目的,搜索字符串設置爲空。 – 2010-03-26 21:53:43

回答

0

雖然我不知道你的代碼語言,但看起來像PHP,請原諒我缺少。$ string格式。我知道你正在使用轉義序列作爲靜態值的引號,例如狀態,類型等,爲了簡單的可讀性我被剝離了。

當我知道我將連接表並期望雙方的條目(因此爲左連接)時,我跳過該條並將其作爲我的直接WHERE子句並直接在FROM中列出所有表。另外,對於MySQL的性能,我告訴它做在我陳述的順序查詢(通過關鍵字STRAIGHT_JOIN)

SELECT STRAIGHT_JOIN 
     DISTINCT bus_products.prod_id 
    FROM 
     bus_products, 
     bus_warehouse_lots, 
     bus_po, 
     bus_warehouse_entries, 
     bus_contracts, 
     bus_warehouse_transfers 
    WHERE 
      bus_products.prod_id = bus_warehouse_lots.product_code 
     AND bus_products.prod_id = bus_po.product_code 
     AND bus_products.prod_id = bus_warehouse_entries.new_product_code 
     AND bus_products.prod_id = bus_contracts.main_product 
     AND bus_warehouse_entries.picking_ticket_num = bus_warehouse_transfers.pt_number 
     AND (  bus_products.last_usage > {yourDateStringFormatted} 
       OR bus_warehouse_lots.status = '2' 
       OR bus_po.status = '0' 
       OR ( bus_warehouse_entries.type = '6' 
        AND bus_warehouse_transfers.status = '0') 
       OR bus_contracts.status = '0' 
      ) 
      { plus your $search_string_6 } 
    ORDER BY 
      bus_products.prod_id 

我會剝奪我們對您Last_Usage日期條款和您的搜索字符串6,以確保您至少得到「ALL」預期的條目。如果您仍然不在,請確保您的OR/AND條件在預期的情況下得到適當平衡。然後,在你的日期限制中重新加入,確保沒問題,然後添加你的最終搜索字符串6.

+0

我改變了我的查詢,並導致我的腳本無限期掛起。唯一的區別是我在where子句中使用OR,因爲我想爲符合任何條件的記錄提供id,並且我還將group by子句放在中,因爲我希望在將來獲得列SUM後這部分工作。任何想法爲什麼它掛起?有關如何解決原始查詢的其他想法? – 2010-03-26 21:52:42

+0

查詢的前5個部分必須是AND子句...這些是加入你的表的基礎 - 在左加入的列表中...它告訴查詢表如何相關...通過改變這些對於OR,你得到了一個對所有5個表的笛卡爾連接,導致1 * x * x * x * x * x記錄,這會使它掛起。保持AND的前5將保持表格之間的1:1比例。查詢的REST是您要應用的「過濾標準」。 – DRapp 2010-03-27 22:22:15

+0

我還沒有看到/聽到過......在切換到「AND」子句後它是否工作?此外,作爲論壇的新手,當有人爲您的問題提供解決方案時,最好點擊解決方案的複選標記。這可以幫助他人接受答案,並幫助他人尋找答案,此外,如果/當您對合法答案的接受程度低時,其他人可能不會提供幫助...... – DRapp 2010-04-09 19:09:31

0

這是dq,不知道如何以自己身份登錄,因爲我是一個客人。無論如何...

我明白你在說關於使用ANDs來確定表關係,但是這不會只返回匹配所有AND標準的結果嗎?如果沒有匹配的轉移記錄,這不會返回產品id嗎?有時產品ID可以在其中一列中找到匹配項,但其他列中沒有匹配項。我希望查詢能夠在所提到的任何一個表中找到可以找到匹配產品ID的記錄,但不會返回在任何其他表中找不到匹配表的記錄。這仍然是最好的方式嗎?