获取数据:复杂的MySQL查询,与PHP循环相比

时间:2011-07-23 01:00:45

标签: php mysql

好的,这是我的问题。

我有一张桌子,我们称之为邮件。主键是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 

这样可行,但我讨厌使用循环来实现某些功能,我认为可以通过查询完成。 这是可能的,如果是的话,怎么样?

谢谢!

1 个答案:

答案 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与最后一行不同时)。