MySQL ВЫБЕРИТЕ, ГДЕ ДЕЛАЕТ - PullRequest
0 голосов
/ 22 апреля 2019

Я хочу сделать простой выбор из таблицы на основе условного предложения where.

Мне так нравится:

CREATE TABLE TEST (SOMETHING TEXT, NAME TEXT, LANG INT(2));

INSERT INTO TEST (SOMETHING, NAME, LANG) VALUES ('123','US',1);
INSERT INTO TEST (SOMETHING, NAME, LANG) VALUES ('234','US',2);
INSERT INTO TEST (SOMETHING, NAME, LANG) VALUES ('345','EU',2);

Я хочу выбрать ИМЯ в LANG = 1, если доступно, в противном случае в LANG = 2.

Я делаю это:

SELECT * FROM TEST WHERE CASE
WHEN LANG=1 THEN LANG=1
ELSE LANG=2
END

Я получаю это:

123 US 1
234 US 2
345 EU 2

Но хочу вот это:

123 US 1
345 EU 2

Должен ли я использовать GROUP HAVING или как?

Больше всего ценю вашу помощь.

Ответы [ 3 ]

0 голосов
/ 22 апреля 2019

Вы можете сделать это с помощью EXISTS:

select t.*
from test t
where not exists (
  select 1 from test 
  where something <> t.something and name = t.name and lang = 1 
)  

См. Демоверсию .Результаты:

| SOMETHING | NAME | LANG |
| --------- | ---- | ---- |
| 123       | US   | 1    |
| 345       | EU   | 2    |
0 голосов
/ 22 апреля 2019

Мы можем справиться с этим, используя ROW_NUMBER:

SELECT SOMETHING, NAME, LANG
FROM
(
    SELECT *, ROW_NUMBER() OVER (PARTITION BY NAME ORDER BY LANG) rn
    FROM yourTable
) t
WHERE rn = 1;

Это, вероятно, самый эффективный способ решения вашей проблемы в MySQL, при условии, что вы используете MySQL8 +.

0 голосов
/ 22 апреля 2019

Вам необходимо самостоятельно объединить вашу таблицу со списком минимальных значений LANG по NAME, затем вы можете выбрать значение SOMETHING, связанное с этим значением LANG:

SELECT T1.*
FROM TEST T1
JOIN (SELECT NAME, MIN(LANG) AS LANG
      FROM TEST
      GROUP BY NAME) T2 ON T2.NAME = T1.NAME AND T2.LANG = T1.LANG

Это вернет минимальное значение LANG для каждого NAME, поэтому, если существует значение 1, оно вернет его, в противном случае вернет 2.

Выход:

SOMETHING   NAME    LANG
345         EU      2
123         US      1

Демонстрация по dbfiddle

...