2015-07-05 56 views
0

表:MySQL的莫名其妙组,然后从标签地图选择

| tag_id | article_id | 
|--------|------------| 
| 1  | 100  | 
|--------|------------| 
| 2  | 100  | 
|--------|------------| 
| 1  | 200  | 
|--------|------------| 
| 1  | 300  | 

我怎么能只选择两个第一排

逻辑: 选择具有 TAG_ID 1和2

ONLY文章

在这种情况下它是ID为100的文章

我可以使用php来过滤结果,b ut mysql通常是整洁的。

+0

有这么多在这里失踪......但是,你写的东西,你可以使用'SELECT * FROM表ORDER BY的article_id LIMIT 2' 你也做'SELECT * FROM表WHERE article_id = 100'。 再一次,我想强调这是多么愚蠢的回答,而没有一个有意义的问题:)。 – hummingBird

+0

表中没有默认订单。如果您没有其他列显示订单.... –

+0

我需要一个ID不知道的文章列表。 还有其他字段表示此表中的顺序,但为了简单起见,我省略了它们。日期或任何其他领域将如何帮助? –

回答

1

要获得有两种TAG_ID的的article_ids 1和2可以使用WHERE子句与GROUP BY子句的having子句限制这样的组合:

select article_id 
from your_table 
where tag_id in (1,2) 
group by article_id 
having count(distinct tag_id) = 2; 

与样品表将返回的article_id = 100

注意,这会返回不只是还TAG_ID 1和2条,还有那些有文章tag_id 1和2加上其他标签 - 它只是将结果限制为至少 tag_id 1和2(但可能更多)的文章。如果你想限制那些只有tag_id 1和2的文章,那么你可以添加一个相关的存在谓词。

Sample SQL Fiddle

+0

谢谢 - 这对我有用。即使在我的实际更复杂的查询这工作︰SELECT * FROM'table1' CROSS JOIN' table2' ON table1.article_id = table2.article_id WHERE tag_id IN(6,14,2)group by article_id具有计数(distinct tag_id)= 3 –

+0

@ArmandP快乐的工作。知道在MySQL中,带有'on'子句的'cross join'将被视为'inner join',这可能就是你想要使用的东西。 – jpw

+0

最后,我将这个解决方案与EXISTS(https://mariadb.com/kb/en/sql-99/exists-predicate)结合使用,因为一些标签是必需的,有些则不是。 @jpw感谢提示。 –

0

一个可能的答案:

SELECT DISTINCT article_id FROM table_name WHERE tag_id IN (1,2); 
+0

这将返回示例表中的所有行,而不仅仅是那些具有_both_ tag_id 1和2的文章。 – jpw

+0

是的,您的答案是正确的。 – L4zl0w

相关问题