MySQL的选择情况

时间:2019-04-21 23:57:26

标签: mysql select case where

我想基于条件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 = 2中使用,我想在LANG = 1中选择名称。

我正在这样做:

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 :(得分:0)

您需要通过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

Demo on dbfiddle

答案 1 :(得分:0)

您可以使用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    |

答案 2 :(得分:0)

我们可以使用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问题的最有效方式。