好的,这是我的问题。
我有一张桌子,我们称之为邮件。主键是MailId。该表与表项具有多对多关系,表具有主键ItemId并引用带有Items.MailId的Mail。然后有一个名为Templates的表,它与Items,Templates.ItemId = Items.ItemId具有一对一的关系。
我想知道的是,获取此数据的最有效方法是什么:
MailId --------------------- ItemId [TemplateId],ItemId [TemplateId],ItemId [TemplateId],ItemId [TemplateId]
所以我在这里想要绘制的是一行,其中在一个表中有一个带有MailId的单元格,然后是一个单元格,其中包含引用此MailId的所有项目,并且每个项目都是一个指向的链接添加或编辑页面,具体取决于此项目是否有模板。
我的解决方案
我首先获取所有的Mails,然后通过PHP中的foreach()
循环运行数组,并在每次迭代时获取此Mail的ItemId。我用来获取ItemId的查询有一个子查询,它计算对这个Item的引用,并返回1或0.它看起来像这样:
SELECT `Items`.*,`Items`.ItemId as wid,(SELECT
count(templateId) from `Templates` where ItemId=wid) as
templateCount from `Item` where MailId=$id
这样可行,但我讨厌使用循环来实现某些功能,我认为可以通过查询完成。 这是可能的,如果是的话,怎么样?
谢谢!
答案 0 :(得分:1)
是的,您可以而且应该在一个查询中执行此操作。
SELECT
Mails.MailId,
Items.*,
COUNT(Templates.ItemId)
FROM
Mails
INNER JOIN
Items
ON
Mails.MailId = Items.MailId
LEFT OUTER JOIN
Templates
ON
Templates.ItemId = Items.ItemId
GROUP BY
Mails.MailId, Items.ItemId
ORDER BY
Mails.MailId, Items.ItemId
您的PHP代码会略有不同,因为您的行只有一个循环。您需要查看MailId以了解何时在HTML中开始新行(当前行的MailId与最后一行不同时)。