Php 将多列与两个表中的多列进行比较
Php 将多列与两个表中的多列进行比较,php,sql,Php,Sql,Table1有tag1,tag2,tag3,tag4…到tag15 Table2有tag1,tag2,tag3,tag4…到tag15 我需要一个SQL select语句来提取任何标记匹配的所有记录 唐道大概是这样的: SELECT table1.* WHERE table1.tag1 = table2.tag1 OR table1.tag1 = table2.tag2 OR table1.tag1 = table2.tag3 (对于每个标签。) 有什么有效的方法吗?您的数据结构很
Table1
有tag1
,tag2
,tag3
,tag4
…到tag15
Table2
有tag1
,tag2
,tag3
,tag4
…到tag15
我需要一个SQL select语句来提取任何标记匹配的所有记录
唐道大概是这样的:
SELECT table1.*
WHERE table1.tag1 = table2.tag1
OR table1.tag1 = table2.tag2
OR table1.tag1 = table2.tag3
(对于每个标签。)
有什么有效的方法吗?您的数据结构很糟糕。标记应该存储在一个单独的表中,每个项和标记对应一行,因此给定的行可能有15个标记。那么查询就相当简单了 简化查询的一种方法是在中使用
:
select *
from table1 t1 join
tabl2 t2
on t1.tag1 in (t2.tag1, t2.tag3, . . . , t2.tag15) or
t1.tag2 in ( . . . ) or
. . .
我认为这甚至适用于标记中的NULL
值
编辑:
逗号分隔的列表甚至比单独的列更糟糕。在MySQL中,您可以执行以下操作:
on find_in_set(substring_index(t1.tags, ',', 1), t2.tags) > 0 or
find_in_set(substring_index(substring_index(t1.tags, ',', 2), -1), t2.tags) > 0 or
find_in_set(substring_index(substring_index(t1.tags, ',', 3), -1), t2.tags) > 0 or
. . .
正确的方法是有两个列如下的表:
- 表1ID
- 标签
及
- 表2id
- 标签
那么查询是:
select *
from table1tags t1t join
table2tags t2t
on t1t.tag = t2t.tag;
比其他选项简单得多。使用IN运算符
SELECT table1.* FROM table1
JOIN table2
WHERE table1.tag1 IN (table2.tag1,table2.tag2,table2.tag3...table2.tag15) OR
table1.tag2 IN (table2.tag1,table2.tag2,table2.tag3...table2.tag15) OR
table1.tag3 IN (table2.tag1,table2.tag2,table2.tag3...table2.tag15) OR
...
...
table1.tag15 IN (table2.tag1,table2.tag2,table2.tag3...table2.tag15)
这等于说
WHERE
table1.tag1 = table2.tag1 OR
table1.tag1 = table2.tag2 OR
...
table1.tag2 = table2.tag2 OR
...
table1.tag2 = table2.tag15 OR
...
table1.tag15 = table2.tag15
只有少很多行。我认为225行或语句是你唯一的方式。。。如果你发布你的模式,我们可能会给你一个更合理的方法来存储你的数据。你能发布一些示例数据吗?在不知道数据是什么样子的情况下,很难尝试并弄清楚什么可能起作用。除了for循环之外,没有有效的方法可以实现类似于'tag'的技巧。$i
听起来你需要规范化你的表。我实际上简化了我的表(我知道仍然不是很好的数据结构),但是如果表1和表2,我在1个逗号分隔的字段中有标记。我如何使用IN将table1.tags中的任何单词与table2.tags中的任何单词进行比较?