【问题标题】:Mysql match between two values as list两个值之间的Mysql匹配作为列表
【发布时间】:2012-02-28 14:21:29
【问题描述】:

我有两个表我想匹配这样的记录

SELECT * FROM records1
WHERE records1.set IN (SELECT records2.p
FROM `records2`
WHERE rcords2.id=1200 )

我只用这个查询来测试它:

SELECT (records2.p)
FROM `records2`
WHERE rcords2.id=1200

它给出的结果

p
========
14, 12, 80

还有这样的records1.set值

set
=============
80, 20, 60

为什么不匹配?

【问题讨论】:

  • 试试这个查询:SELECT r1.* FROM records1 r1 INNER JOIN records2 r2 ON r1.set = r2.p WHERE r2.id = 1200;
  • 无法正常工作,因为我无法使用 = 来列出带逗号的值
  • 等等,我很困惑。您的意思是条目存储在您的数据库中,在实际字段中使用逗号(例如为列 p 返回的每一行都有三个逗号分隔值),还是在上面的示例中,您列出了 @987654327 的结果@,你的意思是返回了三行...一个值为 14,一个值为 12,一个值为 80?
  • 其以逗号存储,例如:14, 15, 18 = 12, 14, 0 - TRUE / 14, 15, 18 = 12, 17, 0 - FALSE
  • 这似乎是非常糟糕的数据库设计。您应该避免在数据库中存储逗号分隔的值,特别是如果您只想基于该单元格的部分进行查询。

标签: mysql database phpmyadmin


【解决方案1】:

您的不同设定值的数量是有限的。所以这应该有效:

SELECT * FROM records1, records2
WHERE (rcords2.id=1200) and (
    ((FIND_IN_SET('12', records1.set) > 0) and (FIND_IN_SET('12', records2.p) > 0)) or
    ((FIND_IN_SET('14', records1.set) > 0) and (FIND_IN_SET('14', records2.p) > 0)) or
    ((FIND_IN_SET('60', records1.set) > 0) and (FIND_IN_SET('60', records2.p) > 0)) or
    ((FIND_IN_SET('80', records1.set) > 0) and (FIND_IN_SET('80', records2.p) > 0)) or
    ...
)

如果两个表的集合以相同的方式(以相同的顺序)定义,二元运算也是可能的:

select * from records1, records2
where (rcords2.id=1200) and (records1.set & records1.set);

这只有在两个列的类型都是 set('12','14','60','80',...) 时才有效

如果它是字符串字段中的逗号分隔列表,则 sql 语句可能如下所示:

SELECT * FROM records1, records2
WHERE (records2.id=1200) and (
(CONCAT(",", records2.p, ",") like CONCAT("%,", substring_index(substring_index(records1.set, ',', 1), ',', -1), ",%")) or
(CONCAT(",", records2.p, ",") like CONCAT("%,", substring_index(substring_index(records1.set, ',', 2), ',', -1), ",%")) or
(CONCAT(",", records2.p, ",") like CONCAT("%,", substring_index(substring_index(records1.set, ',', 3), ',', -1), ",%")) or
(CONCAT(",", records2.p, ",") like CONCAT("%,", substring_index(substring_index(records1.set, ',', 4), ',', -1), ",%")) or
...
(CONCAT(",", records2.p, ",") like CONCAT("%,", substring_index(substring_index(records1.set, ',', N), ',', -1), ",%"))
)

如果字符串字段是 varchar(X),则该字段中的可能值少于 X/2,因此在我的 SQL 语句中将 N 替换为 X/2。

【讨论】:

  • 我不能使用它,因为值来自其他表。
  • 哪些值来自哪个表?
  • 索引搜索的值。来自不同的桌子,我不知道有多少。
  • 很难理解你。 “索引搜索的值。”不是一个完整的句子。 “索引搜索”是什么意思?您在寻找索引吗?你说你有两个表:'records1'和'records2'。那么这些表中的哪一个是“其他”表?还是有更多的桌子?
猜你喜欢
  • 2015-05-23
  • 1970-01-01
  • 2017-12-16
  • 1970-01-01
  • 2012-07-28
  • 1970-01-01
  • 1970-01-01
  • 2012-10-04
  • 1970-01-01
相关资源
最近更新 更多