2016-01-14 2 views
0
size color in_stock 
----- ----- ----- 
small red  0 
large red  1 
xlarge red  1 

Когда я использую GROUP BY size,color, первая строка с in_stock0 выбирается во второй строке. Есть ли способ иметь GROUP BY всегда приоритет для строк с in_stock1, а не in_stock0?Как создать группу MySQL, выбрав одно значение перед другим?

+1

Append 'ORDER BY in_stock DESC' до конца вашего заявления. –

+0

Я уже пробовал это. К сожалению, он упорядочивает после того, как он группируется, поэтому он не оказывает никакого эффекта. – Pat

+0

Пожалуйста, покажите свой полный запрос – Bohemian

ответ

2

Короткий ответ: Нет

Я подозреваю, (потому что вы не предоставите свой первоначальный запрос), который вы используете что-то вроде этого:

SELECT size,color, in_stock 
FROM atable 
GROUP BY size,color 

MySQL разрешает предложение GROUP BY иметь только несколько неагрегационных столбцов - НО это делает это только в силу настройки сервера

см: http://dev.mysql.com/doc/refman/5.0/en/group-by-handling.html

Если вы используете эту «функцию», нет контроля над тем, какие данные выбраны в других неагрегационных столбцах.

Вы не должны использовать эту «функцию» MySQL, потому что если настройки сервера отключат это расширение, ваши запросы больше не будут работать.

Вы могли бы сделать что-то вроде этого, вместо:

SELECT size,color, MIN(case when in_stock = 1 then in_stock else NULL end) 
FROM atable 
GROUP BY size,color 
+0

Кстати: я не уверен, почему вы проигнорируете уровень запаса –

+0

Я не хотел игнорировать их так, чтобы не придавать им приоритета. Платформа, над которой я работаю (Magento), кажется, не дает большой свободы в MySQL. Я закончил получать запас исходного продукта вместо дочернего продукта (родитель будет возвращать только 0, если все дети равны 0). Но +1 и спасибо за подробный ответ на потом! <3 – Pat

0

Вы можете использовать синтаксис согласно ниже

select size, color, in_stock, ....other fields... 
from yourtable 
where ...conditions if any.... 
group by size,color 
order by in_stock desc; 

ордена, всегда работать после того, как группе, так что если вы хотите первого порядка, то группа. Вы можете использовать ниже query-

select size, color, in_stock 
from 
(
select size, color, in_stock, ....other fields... 
from yourtable 
where ...conditions if any.... 
order by in_stock desc 
) as a 
group by size,color; 
+0

Я пробовал, как вы и предполагали. К сожалению, это не повлияло на то, какие из них сгруппированы, и порядок применяется после группировки. – Pat

+0

попробуйте второй запрос ... –

0

Если GROUP BY столбца (ов), а также вернуть не совокупный столбец, который не в предложения GROUP BY, то в какой строке, что значение столбцах взято из не определено. Это может быть первый, это может быть последний. Это может измениться в зависимости от механизма хранения или чего-либо еще.

Если вы специально хотели 2-й, который вы могли бы сделать что-то вроде этого: -

SELECT size, color, SUBSTRING_INDEX(SUBSTRING_INDEX(GROUP_CONCAT(in_stock ORDER BY FIELD(size, 'small', 'large', 'xlarge')), ',', 2), ',', -1) 
FROM atable 
GROUP BY size,color 
Смежные вопросы