Заказ по прототипу - PullRequest
       2

Заказ по прототипу

0 голосов
/ 15 октября 2011

В поле MySQL есть 6 возможных ключей. Давайте назовем их типами. В PHP я определил массив, который называется $ order, и упорядочил эти типы по порядку, в котором я хочу, чтобы они появлялись.

Существует таблица articles, в которой есть поле articles. type. К любой статье может быть добавлено 0-6 типов. Теперь я хочу взять все статьи и заказать их у прототипа. Каков наилучший способ сделать это? Можно ли это сделать в MySQL, так как я полагаю, это будет быстрее? А если нет, то как это можно сделать в PHP?

Пример:

Таблица:

id     articleId     type
1      3             type1
2      3             type2
3      3             type3
4      3             type4
5      4             type5
6      4             type6
7      5             type5
8      7             type1
9      7             type5

Заказать:

$order=array('type1','type2','type3','type4','type5','type6');

Как получить результаты, упорядоченные по моей переменной $order?

Ответы [ 2 ]

1 голос
/ 15 октября 2011

Можно ли это сделать в MySQL, так как я полагаю, это будет быстрее?

Только если вы разрешите MySQL использовать индекс

Вы можете создать временную таблицу:

$query = "CREATE TABLE IF NOT EXISTS test (
            sort INT NOT NULL AUTO_INCREMENT,
            `type` VARCHAR(20) NOT NULL,
          PRIMARY KEY (sort),
          KEY (`type`, sort)  
          ENGINE=MEMORY (SELECT 1,'other' <<-- see query below.
                   UNION SELECT 2,'type1' <<-- build this part using 
                   UNION SELECT 3,'type2' <<-- Marc B's code.
                   UNION SELECT 4,'type3'
                   UNION SELECT 5,'type4'   
                   UNION SELECT 6,'type5'
                   UNION SELECT 7,'type6' ";

Запустите этот запрос.

Теперь вы можете связать этот запрос с помощью объединения и использовать test.sort в качестве ключа сортировки:

SELECT t1.id, t1.article_id, COALESCE(t.`type`,'other') as sort_type
FROM table1 t1
LEFT JOIN test t ON (t1.`type` = t.`type`)
WHERE ....
ORDER BY t.sort;                   

Этот запрос будет полностью проиндексирован и будет выполнен как можно быстрее.

1 голос
/ 15 октября 2011

Вам нужно преобразовать этот массив в оператор if / case в стиле mysql:

$order_by = "ORDER BY CASE";
$pos = 1;
foreach ($order as $clause) {
   $order_by .= " CASE `type`='$clause' THEN " . $pos++;
}
$order_by .= " ELSE " . $pos++;

, который будет генерировать что-то вроде

ORDER BY CASE
   WHEN `type`='type1' THEN 1
   WHEN 'type`='type2' THEN 2
   ...
   ELSE n
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...