在三个表上使用内连接查询 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 ;