2010-06-30 106 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表关系...