我会用这个不同的表设计,类型和子类型。 Your Items表具有单列主键,而您的Blog_Posts和Articles表的主键与Items表的外键具有相同的ID。这将使得这样做非常容易,并且有助于确保数据的完整性。
与您现有的设计,你最好的选择可能是这样的:
SELECT
I.item_id,
I.source_id,
COALESCE(A.date_posted, B.date_posted) AS date_posted,
COUNT(*) AS date_count
FROM
Items I
LEFT OUTER JOIN Articles A ON
A.item_id = I.item_id AND
I.source_id = 'A' -- Or whatever the Articles ID is
LEFT OUTER JOIN Blog_Posts B ON
B.item_id = I.item_id AND
I.source_id = 'B' -- Or whatever the Blog_Posts ID is
GROUP BY
I.item_id,
I.source_id,
COALESCE(A.date_posted, B.date_posted)
您也可以尝试使用UNION
:
SELECT
SQ.item_id,
SQ.source_id,
SQ.date_posted,
COUNT(*) AS date_count
FROM
(
SELECT I1.item_id, I1.source_id, A.date_posted
FROM Items I1
INNER JOIN Articles A ON A.item_id = I1.item_id
WHERE I1.source_id = 'A'
UNION ALL
SELECT I2.item_id, I2.source_id, B.date_posted
FROM Items I2
INNER JOIN Articles B ON B.item_id = I2.item_id
WHERE I2.source_id = 'B'
)
+1:我无法在MySQL上测试,但在SQL Server上测试时,它的优化效果非常好(我没有预计) – MatBailie 2012-01-03 16:42:57
***注意:***同样假设索引与'date_posted'作为第一个领域的最佳性能。 – MatBailie 2012-01-03 16:43:37