Mysql 在带有逗号分隔值的\u集合中查找\u作为排序条件
我正在使用find_in_set使用下面的查询获取数据,它工作正常Mysql 在带有逗号分隔值的\u集合中查找\u作为排序条件,mysql,find-in-set,Mysql,Find In Set,我正在使用find_in_set使用下面的查询获取数据,它工作正常 SELECT * FROM A WHERE FIND_IN_SET( column1, ( SELECT column1 FROM B WHERE id = 21) ); 在这里,这个查询从B中选择column1,其中id=21给出类似“175587282329”的结果 但我想要的是“175587282329”,以我应该使用的最高值为准。在这种情况下,它将是282329。但它将是任意数量的逗号分隔值。 谢谢 虽
SELECT *
FROM A
WHERE FIND_IN_SET(
column1,
(
SELECT column1
FROM B
WHERE id = 21)
);
在这里,这个查询从B中选择column1,其中id=21给出类似“175587282329”的结果
但我想要的是“175587282329”,以我应该使用的最高值为准。在这种情况下,它将是282329。但它将是任意数量的逗号分隔值。
谢谢 虽然我并不十分提倡这是一个解决方案,但请考虑下面的破解……/p>
DROP TABLE IF EXISTS my_table;
CREATE TABLE my_table
(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
,string VARCHAR(20) NOT NULL UNIQUE
);
INSERT INTO my_table(string) VALUES
('1,2,3'),
('2,3,4'),
('3,4,5'),
('1,3,5'),
('2,4,6');
SELECT * FROM my_table;
+----+--------+
| id | string |
+----+--------+
| 1 | 1,2,3 |
| 4 | 1,3,5 |
| 2 | 2,3,4 |
| 5 | 2,4,6 |
| 3 | 3,4,5 |
+----+--------+
SELECT * FROM ints;
+---+
| i |
+---+
| 0 |
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9 |
+---+
SELECT x.*
, GROUP_CONCAT(DISTINCT SUBSTRING_INDEX(SUBSTRING_INDEX(string,',',i+1),',',-1) ORDER BY SUBSTRING_INDEX(SUBSTRING_INDEX(string,',',i),',',-1) DESC) n
FROM my_table x
, ints
GROUP
BY id;
+----+--------+-------+
| id | string | n |
+----+--------+-------+
| 1 | 1,2,3 | 3,2,1 |
| 2 | 2,3,4 | 4,3,2 |
| 3 | 3,4,5 | 5,4,3 |
| 4 | 1,3,5 | 5,3,1 |
| 5 | 2,4,6 | 6,4,2 |
+----+--------+-------+
假设TableA看起来是这样的
CREATE TABLE A (
id INT,
columnA INT
);
以下方法将为您提供所需的结果,据我所知,最多可用于100个分离的值:
SELECT * FROM A
INNER JOIN (
SELECT MAX(t.value) as max_value
FROM (
SELECT
id,
SUBSTRING_INDEX(SUBSTRING_INDEX(column1, ',', n.n), ',', -1) value
FROM B CROSS JOIN (
-- build for up to 100 separated values
SELECT
a.N + b.N * 10 + 1 AS n
FROM
(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) a
,(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) b
ORDER BY n
) n
WHERE n <= (1 + LENGTH(column1) - LENGTH(REPLACE(column1, ',', '')))
AND B.id = 21
) t
) t1
ON A.columnA = t1.max_value
;
此方法是生成此类列表的常用方法,并且速度很快
嵌套的子字符串调用负责获取我们的值,并使用
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(column1, ',', 1), ',', -1) FROM B
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(column1, ',', 2), ',', -1) FROM B
去感受它的作用。我们限制我们的搜索
1 + LENGTH(column1) - LENGTH(REPLACE(column1, ',', ''))
因为我们比值少一个逗号,我们也需要最后一个值。
所以声明
SELECT
id,
SUBSTRING_INDEX(SUBSTRING_INDEX(column1, ',', n.n), ',', -1) value
FROM B CROSS JOIN (
SELECT
a.N + b.N * 10 + 1 AS n
FROM
(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) a
,(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) b
ORDER BY n
) n
WHERE n <= (1 + LENGTH(column1) - LENGTH(REPLACE(column1, ',', '')))
AND B.id = 21
将返回id=21对应的列1中的值列表
其余部分是将此列表的最大值简单地连接到TableA的相应列如果你愿意,考虑一下这个简单的两步过程:1。如果您还没有这样做,请提供适当的DDL和/或SQLFIDLE,以便我们可以更轻松地复制问题。2.如果您还没有这样做,请提供与步骤1中提供的信息相对应的所需结果集。@草莓,我只提供了查询的简单形式,我在第二个条件中使用子查询。也许不规范数据就足够了?@草莓,我已经从API中插入了数据,所以那个时候不可能。我为你们感到抱歉,因为其他人做出了错误的决定。您的问题可以改写为:如何获得逗号分隔列表的最大值。我想你需要做一些繁琐的字符串解析。
SELECT
id,
SUBSTRING_INDEX(SUBSTRING_INDEX(column1, ',', n.n), ',', -1) value
FROM B CROSS JOIN (
SELECT
a.N + b.N * 10 + 1 AS n
FROM
(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) a
,(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) b
ORDER BY n
) n
WHERE n <= (1 + LENGTH(column1) - LENGTH(REPLACE(column1, ',', '')))
AND B.id = 21