在三个表上使用内连接查询 select 个随机值
Query to select random values with inner join on three tables
我有一个数据库 tables,
person: id, bio, name
book: id, id_person, title, info
file: id, id_book, location
其他信息:书籍约 50,000 行,文件约 300,000 行。
我想做的是 select
12 位不同的作者和 select
只有一位 book
然后 book
select location
来自 table 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 并不像人们预期的那样工作。还是我错过了什么?以上代码 returns 同一作者的书籍,与下一本一起使用。这不是我想要的。我想要 12 位不同作者中的每一位的 1 本书。
从数据库中检索此信息的正确方法是什么?另外,我想找回 12 random 个人。不是按连续顺序存储在数据库中的人。我无法用 rand()
来表达任何 query
,因为我什至找不到不同的作者。
我使用 MariaDB。我将不胜感激任何帮助,尤其是让我以出色的表现做到这一点的帮助。
在 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;
但是,这不能保证 return 来自同一行的非 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 ;
我有一个数据库 tables,
person: id, bio, name
book: id, id_person, title, info
file: id, id_book, location
其他信息:书籍约 50,000 行,文件约 300,000 行。
我想做的是 select
12 位不同的作者和 select
只有一位 book
然后 book
select location
来自 table 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 并不像人们预期的那样工作。还是我错过了什么?以上代码 returns 同一作者的书籍,与下一本一起使用。这不是我想要的。我想要 12 位不同作者中的每一位的 1 本书。
从数据库中检索此信息的正确方法是什么?另外,我想找回 12 random 个人。不是按连续顺序存储在数据库中的人。我无法用 rand()
来表达任何 query
,因为我什至找不到不同的作者。
我使用 MariaDB。我将不胜感激任何帮助,尤其是让我以出色的表现做到这一点的帮助。
在 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;
但是,这不能保证 return 来自同一行的非 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 ;