GROUP BY с настройками на основе другого ПОЛЯ - PullRequest
2 голосов
/ 25 февраля 2011

Есть ли способ сделать группу, но придавая большее значение записи, которая получила определенное значение в поле?

Пример:

value - language - externID
1       default      10
1       english      10

2       english      10

3       default      10

Результат SELECT:

1 - english - 10
2 - english - 10
3 - default - 10

IE: когда есть запись с таким же "значением", предпочитайте запись с "английским"

пример: SELECT * FROM tBL WHERE externID = 10 И язык IN ('по умолчанию'), 'english') Значение GROUP BY "PREFER lang = english"

пс."английский" - это пример, который мне нужен. Я могу выбрать конкретный язык: меняйся

Ответы [ 3 ]

3 голосов
/ 25 февраля 2011

Вы можете использовать случай, когда оператор:

http://dev.mysql.com/doc/refman/5.0/en/case-statement.html

Приведите значение для английского языка, которое ниже, чем значение по умолчанию, или сделайте значение по умолчанию абсурдно высоким, затем сортируйте по этому новому имени (например language_value), а затем externID.

select language, enternalID,
case 
   when language = 'english' then 1 
   when language = 'default' then 100 
end case as langVal
from tableName
order by langVal, externalID
0 голосов
/ 25 февраля 2011

По другому вопросу, Yes123 добавил немного больше ...

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

Я понимаю, что это означает ...

  • Если группа содержит искомый язык, вернуть этот язык
  • Если группа не содержит этот язык, но содержит ТОЛЬКО по умолчанию, вернуть значение по умолчанию
  • Если группа не содержит этот язык, но содержит языки не по умолчанию, ничего не возвращается


DECLARE
  @preferred VARCHAR(64)
SET
  @preferred = 'English'

SELECT
  value,
  (
    SELECT
      language
    FROM
      tbl [search]
    WHERE
      externID  = 10
      AND value = tbl.value
      AND language IN ('default', @preferred)
    ORDER BY
      NULLIF(language, 'default') DESC
    LIMIT
      1
  )
FROM
  tbl
WHERE
  externID = 10
GROUP BY
  value
HAVING
  COUNT(*) = SUM(CASE WHEN language IN ('default', @preferred) THEN 1 ELSE 0 END)

В предложении HAVING просто указывается, что каждая запись для этого значения должна быть либо значением по умолчанию, либо языком, который вы ищете.

ORDER BY и LIMIT 1 в подзапросе заставляют 'default' быть последним всегда, всегда. Это означает, что, если предпочтительный язык найден, он отображается в предпочтении.

0 голосов
/ 25 февраля 2011

Опираясь на идею Тьямина, вы можете использовать предложение where, в котором говорится, что язык текущей строки - лучший язык для группы:

select  value
,       language
,       externID
from    YourTable t1
where   case language when 'English' then 3 when 'default' then 2 else 1 end =
        (
        select  max(case language when 'English' then 3 
                        when 'default' then 2 else 1 end)
        from    YourTable t2
        where   t1.value = t2.value
                and t1.language = t2.language
                and t1.externID = t2.externID
        )
group by
        value
,       language
,       externID

Чтобы не возвращать строки, если не найден ни определенный язык, ни значение по умолчанию, используйте:

case language when 'English' then 3 when 'default' then 2 else null end

Поскольку null = null не соответствует действительности, это не будет соответствовать предложению where.

Для универсальной версии, которая предпочитает любой язык по умолчанию, используйте:

case language when 'default' = 1 else 2 end

Эта ставка по умолчанию ниже всего остального.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...