2010-06-30 103 views
0

我有一個查詢需要執行以顯示項目的搜索結果。需要發生什麼,我需要通過「horsesActiveDate」對結果進行排序,這適用於除adtypesID = 7的任何廣告以外的所有廣告。這些結果按日期排序,但必須始終在所有其他廣告之後結果。MYSQL - 在一個查詢中合併兩個結果

因此,我會在結果集中將所有廣告按活動日期和adtypesID!= 7進行排序。之後,我需要按活動日期對所有adtypesID = 7進行排序,並將其附加到所有結果。

我希望把它放在一個查詢中,而不是兩個,並將它們在PHP中附加在一起。代碼編寫的方式,我必須找到一種方法,在一個查詢中獲取所有代碼。

所以這裏是我的原始查詢,它已經很好的工作,直到我不得不廣告adtypesid = 7具有不同的排序要求。

這是現在存在的查詢不考慮用於排序的adtypesID。

SELECT 
    horses.horsesID, 
    horsesDescription, 
    horsesActiveDate, 
    adtypesID, 
    states.statesName, 
    horses_images.himagesPath 

FROM horses 

LEFT JOIN states ON horses.statesID = states.statesID 
LEFT JOIN horses_images ON horses_images.himagesDefault = 1 AND horses_images.horsesID = horses.horsesID AND horses_images.himagesPath != '' 

WHERE 
     horses.horsesStud = 0 
    AND horses.horsesSold = 0 
    AND horses.horsesID IN 
     ( 
      SELECT DISTINCT horses.horsesID 
      FROM horses 
      LEFT JOIN horses_featured ON horses_featured.horsesID = horses.horsesID 
      WHERE horses.horsesActive = 1 
     ) 

ORDER BY adtypesID, horses.horsesActiveDate DESC 

我首先想到的是做兩個查詢,其中一個看起來所有不包含adtypesID = 7和整理那些作爲查詢呢,然後運行第二個查詢只查找adtypesID =這些廣告的廣告7並按日期排序。然後拿這兩個結果並將它們追加到對方。由於我需要將這一切都彙總到一個查詢中,因此我無法使用php函數來執行此操作。

有沒有辦法在mysql中一個接一個地合併兩個查詢結果?有沒有更好的方法來運行這個查詢來完成這個排序?

理想的結果將是如下(我修改了列名,這樣他們就可以更短):

ID | Description | ActiveDate | adtypesID | statesName | himagesPath 
    ___________________________________________________________________________ 

    3 | Ad Text  | 06-01-2010 | 3   | OK   | image.jpg 
    2 | Ad Text  | 05-31-2010 | 2   | LA   | image1.jpg 
    9 | Ad Text  | 03-01-2010 | 4   | OK   | image3.jpg 
    6 | Ad Text  | 06-01-2010 | 7   | OK   | image5.jpg 
    6 | Ad Text  | 05-01-2010 | 7   | OK   | image5.jpg 
    6 | Ad Text  | 04-01-2010 | 7   | OK   | image5.jpg 

可以提供將不勝感激任何幫助!

回答

1

這應該工作:

ORDER BY (adtypesID = 7) ASC, horses.horsesActiveDate DESC 
2

我不知道在MySQL中確切的語法,但類似

ORDER BY case when adtypesID = 7 then 2 else 1 end ASC, horses.horsesActiveDate DESC 

會在其他許多SQL dielects工作。 請注意,大多數SQL方言允許排序不僅是一列,而且是一個表達式。

+0

謝謝你們兩位幫助我。我曾嘗試過這樣的事情,但一直在犯錯誤。這工作就像一個魅力!非常感謝你的幫助。 – Chad 2010-06-30 17:53:42

1

使用聯盟兩個查詢追加在一起,就像這樣:

SELECT whatever FROM wherever ORDER BY something AND adtypesID!=7 

UNION 

SELECT another FROM somewhere ORDER BY whocares AND adtypesID=7 

http://dev.mysql.com/doc/refman/5.0/en/union.html

+0

我不確定這是否適用於MySQL,但它絕對不是標準的SQL。在標準SQL中,對於一個聯合只能有一個命令,而對於每個選擇只能有一個命令。 – Frank 2010-06-30 18:03:11

1

我重新寫你的查詢爲:

SELECT h.horsesID, 
      h.horsesDescription, 
      h.horsesActiveDate, 
      adtypesID, 
      s.statesName, 
      hi.himagesPath 
    FROM HORSES h 
LEFT JOIN STATES s ON s.stateid = h.statesID 
LEFT JOIN HORSES_IMAGES hi ON hi.horsesID = h.horsesID 
          AND hi.himagesDefault = 1 
          AND hi.himagesPath != '' 
LEFT JOIN HORSES_FEATURED hf ON hf.horsesID = h.horsesID 
    WHERE h.horsesStud = 0 
     AND h.horsesSold = 0 
     AND h.horsesActive = 1 
ORDER BY (adtypesID = 7) ASC, h.horsesActiveDate DESC 

IN子查詢,使用LEFT JOIN等將意味着任何記錄的horsesActive值爲1的記錄將被退回 - 無論它們是否具有關聯的HORSES_FEATURED記錄器d。我把它留給你檢查你的數據來決定它是否真的應該是一個INNER JOIN。同樣對於STATES表關係...