gpt4 book ai didi

MySQL - 条件 MIN MAX 返回不同的记录

转载 作者:行者123 更新时间:2023-11-29 09:50:07 25 4
gpt4 key购买 nike

我有一个来自 the geonames website for Great Britain 的数据库转储。它由大约 60000 条记录组成。示例数据如下:

id       |     name    |   admin1   |   admin2   |  admin3  |  feature_class  |  feature_code
-------------------------------------------------------------------------------------------
2652355 | Cornwall | ENG | C6 | | A | ADM2
11609029 | Cornwall | ENG | | | L | RGN
6269131 | England | ENG | | | A | ADM1

第一条记录的特征代码为ADM2,表示管理级别为2第二条记录的要素代码为RGN,表示它是一个区域。

我想按地名搜索记录以构建自动完成功能。如果记录具有相同的名称,并且其中一个记录是一个区域,即具有 feature_code RGN,那么我只想返回该记录记录,否则我想返回与具有最低 id 的名称匹配的记录。

我已尝试以下方法,但不起作用:

   SELECT IF(t0.feature_code = 'RGN', MAX(t0.id), MIN(t0.id)) as id
, CONCAT_WS(', ', t0.name,
IF(t3.name != t0.name, t3.name, NULL),
IF(t2.name != t0.name, t2.name, NULL),
IF(t1.name != t0.name, t1.name, NULL)) AS name
FROM locations t0
LEFT JOIN locations t1 ON t1.admin1 = t0.admin1 AND t1.feature_code = 'ADM1'
LEFT JOIN locations t2 ON t2.admin2 = t0.admin2 AND t2.feature_code = 'ADM2'
LEFT JOIN locations t3 ON t3.admin3 = t0.admin3 AND t3.feature_code = 'ADM3'
WHERE
(t0.feature_class IN ('P', 'A') OR (t0.feature_class = 'L' AND t0.feature_code = 'RGN' ) )
AND t0.name like 'Cornwall%'
GROUP BY CONCAT_WS(', ', t0.name,
IF(t3.name != t0.name, t3.name, NULL),
IF(t2.name != t0.name, t2.name, NULL),
IF(t1.name != t0.name, t1.name, NULL))
ORDER BY t0.name

它返回不正确的记录:

id      | name
---------------------------
2652355 | Cornwall, England

最佳答案

我认为条件聚合应该可以解决问题。您可以按名称过滤记录,然后应用聚合函数中的逻辑。如果存在 feature_code = 'RGN' 的记录,那么您需要选择它,否则您将选择匹配记录中的最小 id

SELECT IFNULL(MAX(CASE WHEN feature_code = 'RGN' THEN id END), MIN(id)) id_found
FROM mytable
WHERE name = @name;

<强> Demo on DB Fiddle 搜索'Cornwall'时:

| id_found |
| -------- |
| 11609029 |

注意:如果您想要整个匹配记录,一种解决方案是简单地将上述结果集与原始表JOIN:

SELECT t.*
FROM mytable t
INNER JOIN (
SELECT IFNULL(MAX(CASE WHEN feature_code = 'RGN' THEN id END), MIN(id)) id_found
FROM mytable
WHERE name = @name
) x ON x.id_found = t.id;

<强> Demo :

| id       | name     | admin1 | admin2 | admin3 | feature_class | feature_code |
| -------- | -------- | ------ | ------ | ------ | ------------- | ------------ |
| 11609029 | Cornwall | ENG | | | L | RGN |

关于MySQL - 条件 MIN MAX 返回不同的记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54960930/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com