【发布时间】:2013-10-04 13:53:31
【问题描述】:
我有几张桌子:
letter_mail
index
sent
from
to
template
public
stamp
stationery
title
content
opened
letter_user
index
username
password
letter_mail 中的所有行都是与另一个表相关的,除了 index、public 和 opens。
letter_mail 中的 From 和 To 对应于 letter_user 的索引。我想要的是从数据库中提取所有数据,如果可能的话,最好在一个查询中。 A * 在 letter_mail 行上选择会产生类似这样的结果:
index:1
sent: 2013-10-03
from:1
to:2
template:1
public:1
stamp:1
stationery:1
title: 1
content: 1
opened : 0
我需要的是,上面的信息用相关表中的数据填充并进行JSON 编码。看起来有点像这样:
index:1
sent: 2013-10-03
from: {1, John}
to: {2, Jane}
template: {index: 1, template: "standard template", url: "template_name"}
public: 0
stamp: {index: 1, stamp: "standard stamp", url: "some/url"}
stationery: {index: 1, stamp: "standard stationery", url: "some/url"}
title: {index: 1, title: "some title"}
content: {index: 1, content: "some text content"}
opened : 0
这完全疯了吗?我应该将查询分成几位还是将所有内容一起整理到一个表中?
如果您需要更多信息,请告知:)
解决办法是这样的:
select
mail.index,
mail.sent,
mail.opened,
mail.public,
FromU.username as FromUser,
ToU.username as ToUser,
T.template as TemplateName,
T.url as TemplateURL,
S.stamp,
S.url as StampURL,
S.stamp Stamp,
STA.url StationaryURL,
Ttl.title,
C.content
from
letter_mail mail
JOIN letter_user FromU
on mail.from = FromU.index
JOIN letter_user ToU
on mail.to = ToU.index
JOIN letter_templates T
on mail.template = T.index
JOIN letter_stamps S
on mail.stamp = S.index
JOIN letter_stationery STA
on mail.stationery = STA.index
JOIN letter_title Ttl
on mail.title = Ttl.index
JOIN letter_content C
on mail.content = C.index
查询有效,但不返回任何行。
【问题讨论】:
-
并不疯狂——尽管您最终会得到大量重复数据,在一次查询中一次获得所有数据。这是否是一个好主意取决于数据的数量以及从网络服务器到数据库的接近度/连接。
-
我只是想避免有 9 个选择查询,但如果这是它所需要的,那么......是的。我可以将查询中的所有数据存储在主表中,但这也会在查询一件事时产生开销。另外,如果人们不赞成,请说明原因:)
-
不是我 - 有些人只是记下他们认为基本的任何问题。除非应该,否则不要将所有数据放在一个表中,以避免数据重复,这是关系数据库的主要点。您应该只需要两个查询,尽管每个表一个。链接可以在 PHP 中完成。