2

我有两张我想加入的表。我对此很陌生,并不完全确定……</p>

第一个表称为场所,变量id、slug、名称等。第二个表是场所术语,变量id、选项、场所、值。匹配的变量显然是venues.id和venue_terms.venue。

我想要做的是查询匹配值的场地术语,然后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';

我想将这些场地_terms.venue 与场地表相匹配。有人可以指出我正确的方向吗?

更新:为了澄清,我正在尝试搜索最终具有相同venue.id的多个选项/值组合。基本上,我希望能够找到 (option = 1 and value = 4) AND (option = 2 and value = 10) AND etc...的所有场所,所有这些都是正确的。

4

4 回答 4

4

您想在 table 的行中找到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)在 terms 表中使用复合索引会提高查询的效率。

于 2012-06-16T20:16:55.690 回答
2

这个怎么样?

SELECT t1.*, t2.*
FROM venue t1 JOIN venue_terms t2
ON t1.id = t2.venue
WHERE (t2.option = 1 AND t2.value = 10)

注意:我相信 option 和 value 是 type 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')

更新 1

根据您的新要求,您只需要使用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)
于 2012-06-16T11:56:19.967 回答
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
于 2012-06-16T12:04:03.397 回答
1

这将连接两个表并打印出与venue_terms 中的属性(选项、值)匹配的场所:

SELECT v.* FROM venue v, venue_terms vt
WHERE v.id = vt.venue
AND vt.option = 1 
AND vt.value = 10
于 2012-06-16T11:47:38.877 回答