2012-01-24 5 views
0

У меня есть проблема с выбором чередующихся строк в MySQL - Image:Чередующихся строк на основе значения столбца в MySQL

CREATE TABLE `images` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `title` varchar(255) DEFAULT NULL, 
    `file` varchar(255) DEFAULT NULL, 
    `project_id` int(10) unsigned DEFAULT NULL, 
); 

И хотим, чтобы иметь возможность выбрать строки из таблицы изображений таким образом, так как имеют переменные значения project_id IS NOT NULL. В основном:

  • изображение с PROJECT_ID
  • изображение без PROJECT_ID
  • изображения с PROJECT_ID
  • изображение без PROJECT_ID
  • изображения с PROJECT_ID
  • изображение без PROJECT_ID

Как это может выполняться в одном SQL-запросе? Я пробовал:

SELECT `images`.*, 
IF(images.project_id, images.project_id % 2, images.id % 2) AS `mixer` 
FROM `images` AS `images` 
ORDER BY `mixer` DESC 

Но это не то, что мне нужно. Кроме того, окончательный запрос, вероятно, будет иметь «GROUP BY images.id» в нем, так что если решение не испортит запрос, который будет весьма желанным.

+0

'группа по images.id' (* уникальное поле *) не имеет смысла для меня. Что вы пытаетесь сделать? –

ответ

2

Интересные проблемы. Попробуйте это:

SELECT images.*, 
FROM images, (SELECT @x:=-1, @y:=0) c 
ORDER BY CASE WHEN project_id is not null THEN @x:[email protected]+2 ELSE @y:[email protected]+2 END; 

Это работает приращение одно из двух значений @x и @y на основе состояния и имеющее значение, которое вы хотите заказать первый начать с более низким начальным значением. Результат оценки находится в диапазоне 1, 2, 3, 4, ..., как можно видеть из бега:

SELECT CASE WHEN project_id is not null THEN @x:[email protected]+2 ELSE @y:[email protected]+2 END z, images.*, 
FROM images, (SELECT @x:=-1, @y:=0) c 
ORDER BY z; 
+0

Интересное решение тоже! Интересно, может ли ограничение вычислений целыми числами лишь немного увеличить его. –

+0

@AndriyM: Спасибо. Достаточно вероятно. Обновленный ответ для использования целых чисел. – flesk

+0

Большое спасибо, на самом деле это действительно работает, однако производительность действительно ужасная. Для таблицы около 70 000 я получаю запрос на 5 секунд. Есть ли способ сделать эту работу быстрее? Может быть, кешировать часть информации внутри самой таблицы? –