Получение данных в определенном порядке с использованием mySql - PullRequest
5 голосов
/ 26 января 2010

Я занят написанием PHP-приложения, которое получает данные из базы данных, но мне нужно получить данные в определенном порядке.

Мой запрос выглядит следующим образом

$sql = "select id,title,type from campaigns where id=$cid order by type";

Теперь моя проблема в том, что это разные типы 'GC', 'MJ', 'MU', 'MS', 'MW', 'MX', 'GS', и я хочу, чтобы MX всегда был последним, поэтому всегда должен быть в конце ряда. Поэтому сначала должны быть выбраны другие, а затем MX. Я надеюсь, что это имеет смысл.

Ответы [ 7 ]

15 голосов
/ 26 января 2010

Вы можете сортировать так:

ORDER BY IF (type = 'MX', 1, 0), type
1 голос
/ 26 января 2010
(select id,title,type from campaigns where id=$cid and type <> 'MX' order by type)
UNION
(select id,title,type from campaigns where id=$cid and type ='MX')
0 голосов
/ 26 января 2010
...
order by case when type = 'MX' then 1 else 0 end, type

будет переносимым на другие базы данных (например, postgresql)

0 голосов
/ 26 января 2010

вы можете использовать UNION

SELECT id, title, type
FROM campaigns
WHERE id={$cid}
AND type != 'MX'
ORDER BY type

UNION

SELECT id, title, type
FROM campaigns
WHERE id={$cid}
AND type == 'MX'

и запустите его как один запрос.

0 голосов
/ 26 января 2010

Другие добавили в методы SQL. Поскольку вы также пометили это с помощью php, я также укажу, что вы можете использовать функцию usort , чтобы определить пользовательскую функцию сравнения, которая будет использоваться алгоритмом сортировки.

 // returns 1 if lhs > rhs, returns 0 if lhs == rhs, returns -1 if lhs <rhs
 function customCompare($lhsRow, $rhsRow)
 {
     $lhsType = $lhsRow['type']
     $rhsType = $lhsRow['type']
     // special case code so that 'MX' is always > then anything (except for another MX)
     if ($lhsType == 'MX')
     {
          if ($rhsType == 'MX')
          {
               return 0;
          }
          else
          {
               return 1;
          }
     }

     // return 1 if lhs > rhs
     if ($lhsType > $rhsType)
     {
         return 1;
     }
     else if ($rhsType < $lhsType)
     {
         return -1;
     }
     else
     {
         return 0;
     }
 }

 $rows = /*perform query without ORDER*/
 usort($rows, "customCompare");
0 голосов
/ 26 января 2010

Сколько строк вы выбираете с помощью вашего запроса? Похоже, только один (я предполагаю, что идентификатор уникален ...), поэтому порядок сортировки не имеет никакого эффекта.

Кроме того, ваш порядок сортировки должен делать то, что должен, поскольку по алфавиту MX будет последним в списке.

0 голосов
/ 26 января 2010
$sql = "select id,title,type from campaigns where id=$cid and type != 'MX' order by type 
union
select id,title,type from campaigns where id=$cid and type = 'MX'"; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...