2010-06-30 4 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 

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

+0

Благодарим вас за то, что помогли мне в этом. Я пробовал что-то подобное, но делал ошибки. Это работало как прелесть!Цените свою помощь много. – Chad

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

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 подзапрос, используя ЛЕВЫЙ JOIN и т. Д., Будет означать, что любая запись лошади, значение которой horsesActive равно 1, будет возвращено - независимо от того, есть ли у них связанный HORSES_FEATURED рекордер д. Я оставляю это вам для проверки ваших данных, чтобы решить, действительно ли это будет INNER JOIN. Аналогично для отношения STATES table ...

Смежные вопросы