2013-04-19 2 views
1

Я читал об этом в течение прошедшего дня (даже здесь), так и не нашел подходящий ресурс, поэтому я выскакиваю его туда снова :)MySQL GROUP_CONCAT DISTINCT упорядоченность аномалии

Проверьте этот два запроса:

SELECT DISTINCT transactions.StoreNumber FROM transactions WHERE PersonID=2 ORDER BY transactions.transactionID DESC; 

и

SELECT GROUP_CONCAT(DISTINCT transactions.StoreNumber ORDER BY transactions.transactionID DESC SEPARATOR ',') FROM transactions WHERE PersonID=2 ORDER BY transactions.transactionID DESC; 

Из всего, что я читал, я бы ожидать, что два запроса, чтобы вернуть те же результаты, при этом второй набор сгруппированных в CSV. Они не такие.

Результат набор для запроса 1 (рисунок каждое значение в отдельной строке, форматирование результатов здесь является громоздким):

'611' '345' '340' '310' '327' ' 323' '362' '360' '330' '379' '356' '367' '375' '306' '354' '389' '343' '346''357' '733' '370' '347' '703' '355' '341' '342' '358' '351' '319' '365' ' 372' '368' '353' '363' '349' '369' '336' '364' '202' '366' '416' '731'

Результат Набор для запроса 2: 611.379.375.389.703.355.351.372.368.362.342.365.353.341.733.347.336.319.354.306.345.364.202.358.370.343.366.349.356.367.369.416.323.346.731.360.363.330.310.357.340.327

Если удалить DISTINCT положение, результаты в составе.

Может ли кто-нибудь указать, что я делаю неправильно с разницей между запросами выше?

Тот факт, что удаление DISTINCT из каждого запроса возвращает тот же результат, указывает на то, что DISTINCT является проблематичным в GROUP_CONCAT. Выполнение GROUP BY вне GROUP_CONCAT приводит к возврату нескольких строк, а это не то, что мне нужно.

Любые идеи о том, как я могу получить список GROUP_CONCAT DISTINCT из StoreNumber, в порядке транзакции DESC?

Спасибо всем

ответ

1

Рассмотрим первый запрос:

SELECT DISTINCT transactions.StoreNumber 
FROM transactions 
WHERE PersonID=2 
ORDER BY transactions.transactionID DESC; 

Это эквивалентно:

SELECT transactions.StoreNumber 
FROM transactions 
WHERE PersonID=2 
group by transactions.StoreNumber 
ORDER BY transactions.transactionID DESC; 

Вы заказываете что-то, что не в select списке. Таким образом, MySQL выбирает произвольный transactionid для каждого номера магазина. Это может отличаться от одного исполнения к другому.

Я считаю, что то же самое происходит в group_concat(). Проблема в том, что выбранное произвольное число отличается для каждого из них.

Если вы хотите консистенцию, рассмотрим эти два запроса:

SELECT transactions.StoreNumber 
FROM transactions 
WHERE PersonID=2 
group by transactions.StoreNumber 
ORDER BY min(transactions.transactionID) DESC; 

и:

SELECT GROUP_CONCAT(DISTINCT t.StoreNumber ORDER BY t.mintransactionID DESC SEPARATOR ',') 
FROM (select t.StoreNumber, min(TransactionId) as minTransactionId 
     from transactions t 
     WHERE PersonID=2.transactionID 
     group by t.StoreNumber 
    ) t 

Они должны давать одинаковые результаты.

Перед тем, как вы слишком громко говорите о MySQL, любая другая база данных вернет ошибку для первого запроса, потому что при использовании select distinct вы можете заказывать только по столбцам в списке select (или выражении, составленном из них).

+0

Спасибо, Гордон - это объясняет многое и отлично разбирается в моей проблеме. – w001y