我正在使用find_in_set
使用以下查询获取数据,并且它可以正常工作。
SELECT *
FROM A
WHERE FIND_IN_SET(
column1,
(
SELECT column1
FROM B
WHERE id = 21)
);
此查询SELECT column1 FROM B WHERE id = 21
提供的结果如'175587,282329'
但是我想要'175587,282329'
这个我应该使用的最高值。在这种情况下,它将是282329
。但是会有任意数量的逗号分隔值。
感谢
答案 0 :(得分:1)
虽然我并不认真地提倡这个解决方案,但请考虑以下黑客......
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 |
+----+--------+-------+
答案 1 :(得分:1)
假设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创建一个值为1到100的临时表:
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
此方法是生成此类列表的常用方法,速度很快。
嵌套的SUBSTRING调用负责获取我们的值,并使用
进行测试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
将返回column1对应于id = 21的值列表。
其余的是将此列表的最大值简单连接到TableA的相应列。