我有两张桌子,我相信我想加入。我对此很新,并不完全确定......
第一个表名为场地,变量为 id,slug,name 等。第二个表为 venue_terms ,变量为< em> id,option,venue,value 。匹配变量显然是 venues.id 和venue_terms.venue。
我想要的是查询 venue_terms 以查找匹配值,然后查询匹配的SELECT * FROM venues
。
我一直在使用以下查询,但无法让它工作。我知道INTERSECT不是解决方案,但我很确定我应该使用哪种JOIN。
SELECT venue
FROM venue_terms
WHERE `option` = '1' AND `value` = '10'
INTERSECT
SELECT venue
FROM venue_terms
WHERE `option` = '2' AND `value` = '4';
我想将这些venue_terms.venue与场地表匹配。有人能指出我正确的方向吗?
更新:为了澄清,我正在尝试搜索最终具有相同venue.id的多个选项/值组合。基本上,我希望能够找到所有场所(选项= 1和值= 4)AND(选项= 2和值= 10)等等...其中所有这些都是真的。
答案 0 :(得分:4)
您希望找到符合表venues
中两个行条件的venue_terms
。这可以通过各种方法完成。最常见的是通过两次加入该表(另一种是通过分组查询)。
这是第一种方式。加入venue_terms
表格两次:
SELECT v.id --- whatever columns you need
, v.slug --- from the venues table
, v.name
FROM venues AS v
INNER JOIN venue_terms AS vt1
ON vt1.venue = v.id
INNER JOIN venue_terms AS vt2
ON vt2.venue = v.id
WHERE ( vt1.option = 1 AND vt1.value = 10 )
AND ( vt2.option = 2 AND vt2.value = 4 ) ;
如果您有3个条件,请加入三次。如果您有10个条件,请加入10次。查询的效率在条件表中的(option, value, venue)
上具有复合索引将是有益的。
答案 1 :(得分:2)
这个怎么样?
SELECT t1.*, t2.*
FROM venue t1 JOIN venue_terms t2
ON t1.id = t2.venue
WHERE (t2.option = 1 AND t2.value = 10)
注意:我认为选项和值的类型为INT
。
如果类型为varchar
,则将上述查询更改为
SELECT t1.*, t2.*
FROM venue t1 JOIN venue_terms t2
ON t1.id = t2.venue
WHERE (t2.option = '1' AND t2.value = '10')
根据您的新要求,您只需使用OR
选项添加该条件,如下所示。
SELECT t1.*, t2.*
FROM venue t1 JOIN venue_terms t2
ON t1.id = t2.venue
WHERE
(t2.option = 1 AND t2.value = 10)
OR
(t2.option = 3 AND t2.value = 14)
答案 2 :(得分:2)
试试这个
SELECT venue.*, venue_terms.*
FROM venue
INNER JOIN venue_terms ON venue.id = venue_terms.venue
WHERE venue_terms.option IN ( 1 ,2)
AND venue_terms.value IN (10,4)
GROUP BY venue.id
答案 3 :(得分:1)
这将连接两个表格并打印出与venue_terms中属性(选项,值)匹配的场地:
SELECT v.* FROM venue v, venue_terms vt
WHERE v.id = vt.venue
AND vt.option = 1
AND vt.value = 10