我有一个数据库,其中有一个表格,用于查询小马的详细信息,另一个用于联系人(所有者和饲养员)的详细信息,然后还有其他几个用于参数(颜色,县,区号等)的小表.为了给我列出现有的小马配置文件,并提供各种详细信息,我使用以下查询:
SELECT *
FROM profiles
INNER JOIN prm_breedgender
ON profiles.ProfileGenderID = prm_breedgender.BreedGenderID
LEFT JOIN contacts
ON profiles.ProfileOwnerID = contacts.ContactID
INNER JOIN prm_breedcolour
ON profiles.ProfileAdultColourID = prm_breedcolour.BreedColourID
ORDER BY profiles.ProfileYearOfBirth ASC $limit
在上面的示例中,“个人资料”表是我的主表(保存着小马的信息),“联系人”的重要性排在第二位,因为它包含所有者和饲养者的信息.较小的参数表可以通过其prm_前缀来标识.上面的查询工作正常,但我想做更多.
第一个大问题是我希望按性别分组结果:种马,母马,Gel种…我使用了<< GROUP BY prm_breedgender.BreedGender>>或<< GROUP BY ProfileBreedGenderID>>在我的ORDER BY行之前,但是从我所有可用的配置文件中仅返回两个结果.我已经阅读了此书,并且显然需要重新组织我的查询以适应我的主要SELECT子句中的GROUP.但是,如何执行此操作使我感到困惑.一步一步的帮助在这里将是幻想.
关于上述内容的进一步说明-您可能已经在查询末尾注意到了$limit变量.这是用于分页,这是我要保留的功能.我不认为这是一个问题.
我的第二个问题更多是组织方面的问题.您可以在此处查看我从联系人表中提取我的所有者信息的位置:
LEFT JOIN contacts
ON profiles.ProfileOwnerID = contacts.ContactID
我可以添加另一个规定:
AND profiles.ProfileBreederID = contacts.ContactID
目的是为了列出小马的所有者和饲养者,并提供有关小马的信息.我不确定如何回显此信息,因为$row [‘ContactName’]可能以所有者或育种者身份应用.
这是仅运行两个查询而不是一个查询的情况吗?将变量$foo分配给查询的第一次运行,然后完全运行另一个单独的查询并将$bar分配给那些结果?还是在一个查询中有更聪明的方法来完成所有操作(例如$row [‘ContactName’] First-iteration,$row [‘ContactName’] Second-iteration)?这里的建议将不胜感激.
就是这样!我已经尽力弄清楚了,并且非常感谢您提供的所有帮助或建议.提前致谢.
################################################ ########################编辑
目前,我的查询是Cularis和Symcbean提供的合并查询:
SELECT *
FROM (
profiles
INNER JOIN prm_breedgender
ON profiles.ProfileGenderID = prm_breedgender.BreedGenderID
LEFT JOIN contacts AS owners
ON profiles.ProfileOwnerID = owners.ContactID
INNER JOIN prm_breedcolour
ON profiles.ProfileAdultColourID = prm_breedcolour.BreedColourID
)
LEFT JOIN contacts AS breeders
ON profiles.ProfileBreederID = breeders.ContactID
ORDER BY prm_breedgender.BreedGender ASC, profiles.ProfileYearOfBirth ASC $limit
在按我希望的那样安排结果的范围内,它是有效的:即按年龄和性别.但是,我似乎无法使别名相对于联系人查询(繁殖者和所有者)起作用.没有错误显示,也没有任何所有者或饲养者.任何对此的进一步澄清将不胜感激.
P.s.我删除了Symcbean的示例为最终LEFT JOIN指定的别名,因为我无法使生成的ORDER BY语句对我有用-我确定是我的错.尽管如此,它现在可以工作,尽管这可能是导致联系人查询出现问题的原因.
解决方法:
如果您提供了表结构的详细信息和大约的行数,将会很有帮助.另外,对SELECT使用’*’是一种麻烦的做法-以后会给您带来麻烦(请参阅下文).
这是什么版本的MySQL?
apparantly need to reorganise my query to accomodate GROUP within my primary SELECT clause
从v4(?IIRC)开始,您不必将查询包装在合并选择中(但是将限制移到外部选择中:
SELECT ProfileGenderID, COUNT(*)
FROM (
[your query without the LIMIT]
) ilv
GROUP BY ProfileGenderID
LIMIT $limit;
(请注意,您不能对ilv.ProfileYearOfBirth进行ORDER BY,因为它不是通过表达式选择的列/分组)
您在prm_breedgender中拥有多少个记录/列?只是种马,母马,Gel种…吗?您认为此列表可能会更改吗?您有多性别的小马吗?我怀疑通过profiles表中的枚举可以更好地表示此域.
with the intention of being able to list a pony’s Owner and Breeder,
使用您建议的代码,您只会获得所有者和饲养者相同的返回实例!您需要添加具有不同别名的contacts表的第二个实例,以将其全部获取,例如
SELECT *
FROM (
SELECT *
FROM profiles
INNER JOIN prm_breedgender
ON profiles.ProfileGenderID = prm_breedgender.BreedGenderID
LEFT JOIN contacts ownerContact
ON profiles.ProfileOwnerID = ownerContact.ContactID
INNER JOIN prm_breedcolour
ON profiles.ProfileAdultColourID = prm_breedcolour.BreedColourID
) ilv LEFT JOIN contacts breederContact
ON ilv.ProfileBreederID = breederContact.ContactID
ORDER BY ilv.ProfileYearOfBirth ASC $limit