簡體   English   中英

MYSQL-在一個查詢中合並兩個結果

[英]MYSQL - Combining Two Results in One Query

我需要執行查詢以顯示項目的搜索結果。 需要發生什么,我需要按“ horsesActiveDate”對結果進行排序,這適用於所有結果,除了adtypesID = 7的任何廣告。 這些結果按日期排序,但它們必須始終排在所有其他廣告之后。

因此,我將根據有效日期和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

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

我不確定MySQL中的確切語法,但是類似

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

可以在許多其他SQL語言中使用。 請注意,大多數SQL方言都允許order by不僅是列,而且是表達式。

這應該工作:

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

使用聯合將兩個查詢附加在一起,如下所示:

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

我將您的查詢重新編寫為:

   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

使用LEFT JOIN等的IN子查詢將意味着將返回horsesActive值為1的任何馬記錄-不管它們是否具有關聯的HORSES_FEATURED記錄。 我將其留給您檢查數據,以決定是否確實是INNER JOIN。 同樣對於STATES表關系...

暫無
暫無

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

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