我有一个带有树表的数据库,
person: id, bio, name
book: id, id_person, title, info
file: id, id_book, location
其他信息:Book约为50,000行,File约为~300,000行。
我要做的是select
12位不同的作者和select
只有一位book
和book
从表中选择location
file
。
我尝试的是以下内容:
SELECT DISTINCT(`person`.`id`), `person`.`name`, `book`.`id`, `book`.`title`, `book`.`info`, `file`.`location`
FROM `person`
INNER JOIN `book`
ON `book`.`id_person` = `person`.`id`
INNER JOIN `file`
ON `file`.`id_book` = `book`.`id`
LIMIT 12
我了解到DISTINCT并不像人们期望的那样工作。或者我错过了什么?上面的代码返回同一作者的书籍,并与下一个书籍一起使用。这不是我想要的。我想要12本不同作者中的每一本都有一本书。
从数据库中检索此信息的正确方法是什么?此外,我想要检索12个随机人。不是在数据库中以连续顺序存储的人。我无法用query
制定任何rand()
,因为我甚至无法得到不同的作者。
我使用MariaDB。我会感谢任何帮助,尤其是帮助我以出色的表现来做到这一点。
答案 0 :(得分:1)
在MySQL中,您可以使用GROUP BY
SELECT p.`id`, p.`name`, b.`id`, b.`title`, b.`info`, f.`location`
FROM `person` p INNER JOIN
`book` b
ON b.`id_person` = p.`id` INNER JOIN
`file` f
ON f.id_book = b.id
GROUP BY p.id
ORDER BY rand()
LIMIT 12;
但是,不能保证从同一行返回非id
值(尽管在实践中确实如此)。而且,虽然作者是随机的,但书籍和地点却不是。
一致地执行此操作的SQL查询有点复杂:
SELECT p.`id`, p.`name`, b.`id`, b.`title`, b.`info`,
(SELECT f.location
FROM file f
WHERE f.id_book = b.id
ORDER BY rand()
LIMIT 1
) as location
FROM (SELECT p.*,
(SELECT b.id
FROM book b
WHERE b.id_person = p.id
ORDER BY rand()
LIMIT 1
) as book_id
FROM person p
ORDER BY rand()
LIMIT 12
) p INNER JOIN
book b
ON b.id = p.book_id ;