MYSQL - объединение двух результатов в одном запросе - PullRequest
0 голосов
/ 30 июня 2010

У меня есть запрос, который мне нужно выполнить, чтобы показать результаты поиска по проекту.Что должно произойти, мне нужно отсортировать результаты по «horseActiveDate», и это относится ко всем из них, за исключением любого объявления с 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 ]

2 голосов
/ 30 июня 2010

Я не уверен насчет точного синтаксиса в MySQL, но что-то вроде

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

будет работать во многих других диалектах SQL.Обратите внимание, что большинство диалектов SQL позволяют упорядочивать не только столбец, но и выражение.

1 голос
/ 30 июня 2010

Я переписал ваш запрос как:

   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. Я оставляю это вам для проверки ваших данных, чтобы решить, действительно ли это должно быть ВНУТРЕННЕЕ СОЕДИНЕНИЕ. Точно так же для табличных отношений STATES ...

1 голос
/ 30 июня 2010

Используйте объединение для добавления двух запросов, например:

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

1 голос
/ 30 июня 2010

Это должно работать:

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