2013-07-28 4 views
0

У меня есть список серверов, и в первую очередь, я хочу, чтобы к серверу обращайтесь к большинству онлайн-пользователей,PHP mysql order by if this == this, then order by this, else order by this?

, но в случае, если есть сервер, который в настоящее время находится в разработке +, имеет наибольшее количество игроков онлайн сейчас , Я хочу игнорировать его.

В основном заказ от PLAYERS COUNT + status = доступен, но он не работает?

$query = $this->controller->db->fetch("argonite_servers", null, null, "server_status = 'Available', server_players"); 

И это мой метод:

public function fetch($table, array $criteria = null, $limit = null, $order = null) 
    { 
     // The query base 
     $query = "SELECT * FROM $table"; 

     // Start checking 
     if ($criteria) { 
      $query .= ' WHERE ' . implode(' AND ', array_map(function($column) { 
       return "$column = ?"; 
      }, array_keys($criteria))); 
     } 

     // limit 
     if ($limit) 
     { 
      $query .= " LIMIT ". $limit; 
     } 

     //order 
     if ($order) 
     {  
      $query .= " ORDER BY ".$order." DESC"; 
     } 

     $check = $this->pdo->prepare($query) or die('An error has occurred with the following message:' . $query); 
     if ($criteria) 
      $check->execute(array_values($criteria)); 
     else 
      $check->execute(); 
     return $check; 
    } 

Почему не он отображает все серверы которых доступны + имеет наибольшее количество игроков на вершине?

Прямо сейчас, моя таблица показывает это:

img http://gyazo.com/e30bd07841cdec90e6854c55baddaf9e.png;

Что я сделал не так?

+0

Показать запрос, а не код. –

+0

Запрос: «SELECT * FROM argonite_servers ORDER BY server_players, server_status =« Доступно »DESC« –

ответ

1

Вы, где предложение, вероятно, select * from argonite_servers where server_status = 'Available' order by server_players desc; Похоже, вы объединили свои предложения order и criteria в своем вызове метода вместо того, чтобы держать их отдельно.

Таким образом, вместо

$query = $this->controller->db->fetch("argonite_servers", null, null, "server_status = 'Available', server_players"); 

Вы можете:

$query = $this->controller->db->fetch("argonite_servers", "server_status ='Available'", null, "server_players"); 

EDIT:

Чтобы сохранить 'доступный' статус показывает вам повезло, что 'Доступный' в алфавитном порядке вперед из них:

$query = $this->controller->db->fetch("argonite_servers", null, null, "server_status ASC, server_players");  
+0

Но таким образом он будет извлекать только доступные серверы, я хочу, чтобы их отображали, но только не в верхней части таблицы (if есть те, которые доступны). –

+0

В основном то, что мне нужно, ORDER BY (если есть доступные серверы, закажите все доступные серверы по количеству игроков) else, закажите все серверы по количеству игроков. Кто-то сказал мне, что я могу использовать случаи MYSQL, но я не уверен, как это сделать. –

+0

Редактирование работы? В сущности, поскольку «Доступно» приходит до «Полный», вы заказываете по первой колонке по алфавиту по возрастанию, а затем заказываете количество игроков, спускающихся. Это просто повезло, что порядок работы ... если у вас есть третий статус типа «Доступный» (Ac GSP