2010-03-02 2 views
11

Насколько я знаю, группы mysql GROUP BY, найденные до последней записи.GROUP BY возвращает первую запись

Есть ли решение для GROUP по первой записи?

У меня есть команда ORDER в SQL, и мне нужна GROUP BY, возвращая первую запись, а не последнюю.

EDIT

Вот запрос

SELECT 
    DISTINCT(master.masterID), 
    langData.*, 
    master.* 
FROM master_table as master 
INNER JOIN lang_table as langData ON 
langData.masterID=master.masterID 
GROUP BY master.masterID 
ORDER BY 
CASE 
    WHEN langData.lang='currentLang' THEN 1 ELSE 999 END , 
    master.name desc LIMIT 0,10 

Запрос выше выберите masterID для мульти таблицы языка и предполагают, чтобы вернуть ПЕРВЫЕ записи в currentLang и заказать их по имени, а затем все остальные языки.

Не спрашивайте меня, почему я не устанавливаю язык в JOIN. Это способ сделать.

Так что все работает нормально до сих пор ожидает сценарий, что у меня есть запись с языками en и fr. Если currentLang является en затем на основе

langData.lang='currentLang' THEN 1 ELSE 999 END 

en порядка является 1 и fr заказа составляет 999 и вместо того, чтобы значение en я получаю значение fr.

Вот почему я хочу сгруппировать в первую строку.

+0

Я не буду спрашивать вас, почему вы не установите язык в 'JOIN' , скорее я скажу вам, что таким образом это не сработает. Неагрегированное выражение в 'GROUP BY' возвращает произвольную запись из каждой группы и не предполагается использовать, если значения меняются. Вы можете вернуть любую запись из 'master_table' (все они будут одинаковыми в каждой группе), но не из' lang_table'. Нет гарантии, по которой будет возвращена запись, nada, niente. 'BTW', почему у вас« DISTINCT »здесь, какова его цель? – Quassnoi

+0

Я пытаюсь достичь «дайте мне сначала все записи из текущего языкового порядка по имени, а затем для всех остальных языков по имени». Значение: если текущий lang - EN, тогда получите все записи для EN, а затем получите все записи для других языков. IF в таблице lang для одной записи имеет EN, FR возвращает значение EN.IF в таблице lang. EN не существует. Return any other lang – ntan

+0

это очень легко сделать с 'JOIN', как описано здесь: http: // explainextended. com/2009/08/10/fallback-language-names-mysql /, но по какой-то странной причине (о которой вы даже не хотите, чтобы вас просили) вы неохотно ее используете. – Quassnoi

ответ

11

Я полагаю, вы говорите о чем-то вроде

SELECT * 
FROM mytable 
GROUP BY 
     column 

Вы не должны использовать неагрегированное выражение в GROUP BY, если они не все же в пределах группы.

Если вы хотите, чтобы вернуть запись, удерживающий наименьшее значение выражения в группе, используйте:

SELECT mo.* 
FROM (
     SELECT DISTINCT column 
     FROM mytable 
     ) md 
JOIN mytable mo 
ON  mo.id = 
     (
     SELECT id 
     FROM mytable mi 
     WHERE mi.column = md.column 
     ORDER BY 
       mi.column, mi.someorder 
     LIMIT 1 
     ) 
1

Добавить LIMIT 1 на ваш запрос.

+0

невозможно. Запись записи для сетки и пейджинга – ntan

Смежные вопросы