mySQL SELECT 哪里的情况
mySQL SELECT WHERE CASE
我想根据条件 where 子句从 table 中创建一个简单的 select。
我喜欢这样:
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);
我想 select 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 还是如何使用?
非常感谢您的帮助。
您需要通过 NAME
自行将 table 加入到最小 LANG
值的列表中,然后您可以 select 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
这将 return 每个 NAME
的最小 LANG
值,因此如果存在值 1,它将 return ,否则将 return 2.
输出:
SOMETHING NAME LANG
345 EU 2
123 US 1
你可以用 EXISTS 做到这一点:
select t.*
from test t
where not exists (
select 1 from test
where something <> t.something and name = t.name and lang = 1
)
参见demo。
结果:
| SOMETHING | NAME | LANG |
| --------- | ---- | ---- |
| 123 | US | 1 |
| 345 | EU | 2 |
我们可以使用 ROW_NUMBER
:
来处理这个问题
SELECT SOMETHING, NAME, LANG
FROM
(
SELECT *, ROW_NUMBER() OVER (PARTITION BY NAME ORDER BY LANG) rn
FROM yourTable
) t
WHERE rn = 1;
假设您使用的是 MySQL8+。
,这可能是处理您在 MySQL 中问题的最高效方法
我想根据条件 where 子句从 table 中创建一个简单的 select。
我喜欢这样:
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);
我想 select 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 还是如何使用?
非常感谢您的帮助。
您需要通过 NAME
自行将 table 加入到最小 LANG
值的列表中,然后您可以 select 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
这将 return 每个 NAME
的最小 LANG
值,因此如果存在值 1,它将 return ,否则将 return 2.
输出:
SOMETHING NAME LANG
345 EU 2
123 US 1
你可以用 EXISTS 做到这一点:
select t.*
from test t
where not exists (
select 1 from test
where something <> t.something and name = t.name and lang = 1
)
参见demo。
结果:
| SOMETHING | NAME | LANG |
| --------- | ---- | ---- |
| 123 | US | 1 |
| 345 | EU | 2 |
我们可以使用 ROW_NUMBER
:
SELECT SOMETHING, NAME, LANG
FROM
(
SELECT *, ROW_NUMBER() OVER (PARTITION BY NAME ORDER BY LANG) rn
FROM yourTable
) t
WHERE rn = 1;
假设您使用的是 MySQL8+。
,这可能是处理您在 MySQL 中问题的最高效方法