我需要执行一个查询来显示项目的搜索结果。需要做什么,我需要通过“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
我们将非常感谢您提供的任何帮助!
答案 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
答案 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表关系...