Mysql 选择父&x2B;他的孩子+;按nPages排序的儿童书籍
父亲的桌子Mysql 选择父&x2B;他的孩子+;按nPages排序的儿童书籍,mysql,database,left-join,Mysql,Database,Left Join,父亲的桌子 id name age married 9 Max 45 1 儿童桌 id father_id name 12 9 Rose 书桌 id owner_id title nPages 1 12 Harry potter 755 2 12 JDK 124 我试过了 Select fa
id name age married
9 Max 45 1
儿童桌
id father_id name
12 9 Rose
书桌
id owner_id title nPages
1 12 Harry potter 755
2 12 JDK 124
我试过了
Select father.*, child.*, books.*
FROM fathers father
LEFT JOIN children child
ON child.father_id = father.id
LEFT JOIN books book
ON book.owner_id = child.id
WHERE father.married = 1
LIMIT 1
它只返回父和子+一本书。但我需要孩子所有的书都按页数分类
大概是这样的:
[
name : MAX ,
age : 45,
married : 1,
child => [
father_id => 9,
name => Rose,
books => [
book1 => ...,
book2 => ...
]
]
]
你能帮帮我吗
注意!父亲只能有一个孩子 你试过类似的东西吗
SELECT
father.name AS fatherName,
child.name AS childName,
COUNT(books.owner_id) AS bookCount
FROM
books
INNER JOIN child ON books.owner_id = child.id
INNER JOIN father ON child.father_id = father.id
GROUP BY
books.owner_id
ORDER BY
bookCount DESC
LIMIT 1
已更新(未选中)
最终更新(未选中)
你试过这样的东西吗
SELECT
father.name AS fatherName,
child.name AS childName,
COUNT(books.owner_id) AS bookCount
FROM
books
INNER JOIN child ON books.owner_id = child.id
INNER JOIN father ON child.father_id = father.id
GROUP BY
books.owner_id
ORDER BY
bookCount DESC
LIMIT 1
已更新(未选中)
最终更新(未选中)
我只是不记得MySQL是否允许您在子句中为
添加限制。。。但你让我知道:
SELECT f.*, b.*, c.* FROM books b
JOIN children c ON b.owner_id = c.id
JOIN fathers f ON c.father_id = f.id
WHERE c.id in (
SELECT owner_id from books
GROUP BY owner_id
ORDER BY count(*) DESC
LIMIT 1
)
ORDER BY b.nPages
这应该适用于任何数量的儿童。我只是不记得MySQL是否允许您在
子句中为添加限制。。。但你让我知道:
SELECT f.*, b.*, c.* FROM books b
JOIN children c ON b.owner_id = c.id
JOIN fathers f ON c.father_id = f.id
WHERE c.id in (
SELECT owner_id from books
GROUP BY owner_id
ORDER BY count(*) DESC
LIMIT 1
)
ORDER BY b.nPages
这应该适用于任意数量的child。您希望查询返回某种json吗?:)不,但是使用json_encode将结果数组转换为json。您必须将问题分为两部分:首先编写一个查询来计算每个孩子的图书数量,然后将其用作子查询以获得所需的结果。mysql查询不会返回json编码的结果。首先,处理查询。然后找到在应用程序(在您的例子中是PHP)级别表示数据的方法。father.married=1如何帮助实现结果(基于此问题的标题)您希望查询返回某种json吗?:)不,但是使用json_encode将结果数组转换为json。您必须将问题分为两部分:首先编写一个查询来计算每个孩子的图书数量,然后将其用作子查询以获得所需的结果。mysql查询不会返回json编码的结果。首先,处理查询。然后找到在应用程序(PHP,在您的例子中)级别表示数据的方法。father.married=1如何帮助实现结果(基于此问题的标题)这并不能解决问题。他想要的是“书最多的孩子”。您的解决方案只获得拥有最高所有者id的解决方案。对不起,在ORDER子句中意外使用了所有者id(而不是bookCount)。应该是有效的。问题是这只会限制在一行,而且OP需要为孩子的父亲提供所有的书,因为孩子的书最多。你问题的标题有点误导。我会很快更新我的答案。是的,标题有误导性。我很抱歉,但是描述很清楚。这并不能解决问题。他想要的是“书最多的孩子”。您的解决方案只获得拥有最高所有者id的解决方案。对不起,在ORDER子句中意外使用了所有者id(而不是bookCount)。应该是有效的。问题是这只会限制在一行,而且OP需要为孩子的父亲提供所有的书,因为孩子的书最多。你问题的标题有点误导。我会很快更新我的答案。是的,标题有误导性。很抱歉,但是描述很清楚。你检查过这个吗?我的意思是,books表中的id似乎没有任何链接。不,我没有(我没有模式:),但正如您所说,它不是id,而是所有者id。更新了。你的查询比我的好。(除了我不明白计数(*)对于这种情况)没有更好,没有更糟。。。完全不同Count(*)
将对行进行计数,而Count(field)
将对具有非空字段的行进行计数。在这种情况下,拥有一个计数(owner\u id)
将是一样的,因为没有所有者的书籍是没有意义的。如果有,并且它们恰好是大多数,那么内部select将只返回一个null
值。如果使用count(owner\u id)
,则计数中将忽略所有空值,并返回一个非空的owner\u id
。是否检查了此项?我的意思是,books表中的id似乎没有任何链接。不,我没有(我没有模式:),但正如您所说,它不是id,而是所有者id。更新了。你的查询比我的好。(除了我不明白计数(*)对于这种情况)没有更好,没有更糟。。。完全不同Count(*)
将对行进行计数,而Count(field)
将对具有非空字段的行进行计数。在这种情况下,拥有一个计数(owner\u id)
将是一样的,因为没有所有者的书籍是没有意义的。如果有,并且它们恰好是大多数,那么内部select将只返回一个null
值。如果使用count(owner\u id)
则会从计数中忽略所有空值,并返回非空的owner\u id
。