Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 将多列与两个表中的多列进行比较_Php_Sql - Fatal编程技术网

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中的任何单词进行比较?