Php 我有一个简单的系谱数据库,希望构造一个返回名称而不是id的查询

Php 我有一个简单的系谱数据库,希望构造一个返回名称而不是id的查询,php,mysql,database,Php,Mysql,Database,我有一个系谱数据库,非常简单的列是系谱ID(自动递增主键)、名称(动物名称)、damid、sireid。每种动物都有一个系谱,一旦动物有了后代,这个系谱就被用作雄性或雄性。我想返回最受欢迎的父系——数据库中孩子最多的父系,但我很难做到这一点 我的sql查询很蹩脚,需要处理 此查询用于按id返回50个最受欢迎的父系: SELECT pedigreeid, name, sireid, count(sireid) AS popular FROM pedigree GROUP BY sireid ORD

我有一个系谱数据库,非常简单的列是系谱ID(自动递增主键)、名称(动物名称)、damid、sireid。每种动物都有一个系谱,一旦动物有了后代,这个系谱就被用作雄性或雄性。我想返回最受欢迎的父系——数据库中孩子最多的父系,但我很难做到这一点

我的sql查询很蹩脚,需要处理

此查询用于按id返回50个最受欢迎的父系:

SELECT pedigreeid, name, sireid, count(sireid) AS popular
FROM pedigree
GROUP BY sireid
ORDER BY popular 
DESC LIMIT 50

但对于名字和系谱,它只是返回第一个拥有最受欢迎的父系的后代作为父系。它不会返回父系的名称(我可以使用“父系ID”列中的数字查找它,但我想编写一个查询来执行此操作。

您可以使用一个自子查询来获取此类信息;您当前选择的系谱ID和名称几乎毫无意义(它们是父系ID的一个后代的系谱ID和名称)

此查询将获得最受欢迎的父系的id和后代数量:

SELECT sireid, COUNT(*) AS numOffspring 
FROM pedigree 
GROUP BY sireid 
ORDER BY numOffspring DESC
LIMIT 50
以上需要订购,才能获得50个最受欢迎的产品

现在,您需要获取父系的数据:

SELECT s.pedigreeid, s.name, popular.numOffSpring
FROM (
   -- The above query goes here
) AS popular 
INNER JOIN pedigree AS s ON popular.sireid = s.pedigreeid
ORDER BY popular.numOffspring DESC

ORDER BY需要在外部查询中重复,因为您不能依赖子查询的顺序通过联接来保留。

要提取sireid的名称,您可以将自联接添加到聚合查询中,如:

SELECT 
    t2.pedigreeid, 
    t2.name
    count(*) popular
FROM
     pedigree t1
    INNER JOIN pedigree t2 ON t1.sireid = t2.pedigreeid
GROUP BY
    t2.pedigreeid, 
    t2.name
ORDER BY popular DESC 
LIMIT 50

PHP代码在哪里?有什么关系吗?这非常有效,谢谢。你说得对,我的查询是胡说八道。@HerronHill如果它被认为是胡说八道的话,我不想“胡说八道”以一种侮辱或贬损的方式,就像描述你最终会收到的数据一样。你真好,但你第一次是对的,这是胡说八道。再次感谢!