假设我们有一些我们想要查询的表A,它通过一对多关系与另一个表B相关,因此,A可以有几个B对象,而每个B对象只能有一个A宾语。问题是,在查询A时,我需要按表B上的列进行筛选。这样做的最佳方法是什么?
如果我使用JOIN,那么我最终会在结果中重复A行。它是合乎逻辑的,因为A对象可以有许多B对象。在MySQL中,我可以通过使用GROUP BY来避免重复,但这在其他数据库系统上是不可能的,它们会强制您使用聚合函数。
如果我使用子查询,那么我认为性能不好,因为最嵌套的子查询可能会返回非常多的行:
SELECT * FROM A WHERE ID IN (SELECT A_ID FROM B WHERE B.some_column = 'my-filter');
那个子查询看起来很糟糕,如果B有大量行,就时间/性能来说可能会很痛苦。
* A_ID是此示例中的外键,它指向表A中的ID字段。
那么,这样做的好方法是什么?
答案 0 :(得分:2)
使用联接和不同的
selct distinct A.*
from A
inner join B
on B.ID = A.ID
where B.ColumnB = 'Filter'
答案 1 :(得分:1)
其他数据库系统上的GROUP BY
没有问题!它们只是强迫你在GROUP BY
子句或中用聚合函数编写整列,因为它应该是,而不是允许这个愚蠢的东西的MySQL。所以:
SELECT a.Col1,a.Col2,a.Col3...
FROM A
JOIN B
ON(a.id = b.id)
WHERE B.some_column = 'my-filter'
GROUP BY a.Col1,a.Col2,a.Col3...