Mysql Сохранение порядка при использовании вложенного запроса

sage

Новичок
Есть схема: http://www.sqlfiddle.com/#!2/dcbf5/1

Как получить список уникальных idPerformance, сохраняя порядок запроса?

Т.е., чтобы в результате получился список:

4
1
2
5
6

Спасибо.
 

WMix

герр M:)ller
Партнер клуба
я перелил бы в табличку, чтоб новую секвенцию создать, по которой после можно было бы отсортировать
но как решение http://www.sqlfiddle.com/#!2/5f4fb/20
 
Последнее редактирование:

sage

Новичок
большое спасибо, но очень странное поведение на MariaDB 5.5.33. Если верить SQL Fiddle и принимать результат, полученный там, как результат, полученный на MySQL, то MariaDB даёт совершенно непонятный результат:

PHP:
select idPerformance,@curRow := @curRow + 1 `Row`
from (
  SELECT `t1`.`idPerformance`
  FROM `Performance` `t1` 
  LEFT JOIN `Schedule` `t2` ON `t2`.`idPerformance` = `t1`.`idPerformance`
  WHERE `t1`.`idTheatre` = 1
  ORDER BY  IF (`t2`.`date` >= CURDATE(), 0, 1), `t2`.`date`
) t3,(SELECT @curRow:=0) foo
Код:
idPerformance 	Row 	
1 	          1
2 	          2
2 	          3
1 	          4
2 	          5
6 	          6
4 	          7
5 	          8
 

WMix

герр M:)ller
Партнер клуба
тогда посмотри на это с другой перспективы
http://www.sqlfiddle.com/#!2/5f4fb/63

я попытался этой строкой
PHP:
 DATEDIFF(CURDATE(), ifNull(`t2`.`date`,'2013-09-30')) + if(`t2`.`date` >= CURDATE(), 10, 0)
посчитать твой способ имеющий сдвиг и NULL
PHP:
IF (`t2`.`date` >= CURDATE(), 0, 1), `t2`.`date`
'2013-09-30' это типа минимальная возможная дата а 10 максимальное дней в будущем
но уже такие извраты ....
 

sage

Новичок
Подзапрос то всё правильно сортирует. И в MariaDB, и в SQL Fiddle:

PHP:
  SELECT `t1`.`idPerformance`
  FROM `Performance` `t1` LEFT JOIN `Schedule` `t2` ON `t2`.`idPerformance` = `t1`.`idPerformance`
  WHERE `t1`.`idTheatre` = 1
  ORDER BY  IF (`t2`.`date` >= CURDATE(), 0, 1), `t2`.`date`
Код:
idPerformance
4
1
2
5
1
6
2
2
SQL Fiddle даёт верный результат на всех доступных версиях MySQL при запросе:

PHP:
SELECT DISTINCT *
FROM (
  SELECT `t1`.`idPerformance`
  FROM `Performance` `t1` LEFT JOIN `Schedule` `t2` ON `t2`.`idPerformance` = `t1`.`idPerformance`
  WHERE `t1`.`idTheatre` = 1
  ORDER BY  IF (`t2`.`date` >= CURDATE(), 0, 1), `t2`.`date`
) `t3`
Код:
4
1
2
5
6
Что это за разные поведения и кто виноват?)
 

WMix

герр M:)ller
Партнер клуба
distinct это тотже group by осознай это, чем 3я 2ка хуже первой? алгоритм называют в этом случае "не стабильный", но вопрос скорости же! с Fiddle тебе просто повезло, мирись с этим и решай!
 
Последнее редактирование:

sage

Новичок
да тут, как бы, дело в том, что даже чистый запрос

PHP:
SELECT *
FROM (
SELECT `t1`.`idPerformance`
  FROM `Performance` `t1` LEFT JOIN `Schedule` `t2` ON `t2`.`idPerformance` = `t1`.`idPerformance`
  WHERE `t1`.`idTheatre` = 1
  ORDER BY  IF (`t2`.`date` >= CURDATE(), 0, 1), `t2`.`date`
) `t3`
SQL Fiddle выдаёт

Код:
IDPERFORMANCE
4
1
2
5
1
6
2
2
а MariaDB

Код:
idPerformance
1
2
2
1
2
6
4
5
зачем пересортировывает и как этого избежать, ума не приложу :(
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
...[deleted]
 
Последнее редактирование:

Breeze

goshogun
Команда форума
Партнер клуба
зачем пересортировывает и как этого избежать, ума не приложу :(
затем, что select без order by это лотерея порядка
то, что сегодня работает без ордера, при смене версии может перестать работать
заполни order поле в подзапросе и в выборке из t3 сделай сортировку по нему
 
  • Like
Реакции: WMix

WMix

герр M:)ller
Партнер клуба
затем, что select без order by это лотерея порядка
exactus, вот и ответ на вопрос:
очень странное поведение на MariaDB 5.5.33. Если верить SQL Fiddle и принимать результат, полученный там, как результат, полученный на MySQL, то MariaDB даёт совершенно непонятный результат:
и кстати решается в лет,
PHP:
select idPerformance,@curRow := @curRow + 1 `Row`
from (
  SELECT `t1`.`idPerformance`,`t2`.`date`
  FROM `Performance` `t1` 
  LEFT JOIN `Schedule` `t2` ON `t2`.`idPerformance` = `t1`.`idPerformance`
  WHERE `t1`.`idTheatre` = 1
) t3,(SELECT @curRow:=0) foo
ORDER BY  IF (`t3`.`date` >= CURDATE(), 0, 1), `t3`.`date`
 
Последнее редактирование:
Сверху