MYSQL - 在一个查询中组合两个结果

时间:2010-06-30 17:39:34

标签: sql mysql query-optimization

我需要执行一个查询来显示项目的搜索结果。需要做什么,我需要通过“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

我们将非常感谢您提供的任何帮助!

4 个答案:

答案 0 :(得分:2)

我不确定MySQL中的确切语法,但是像

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

可以在许多其他SQL方言中使用。 请注意,大多数SQL方言允许order by不仅是一列,而且是一个表达式。

答案 1 :(得分:1)

这应该有效:

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

答案 2 :(得分: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

答案 3 :(得分: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记录。我留给你检查你的数据,以决定它是否真的应该是一个INNER JOIN。同样对于STATES表关系...