查询以在三个表上选择具有内部联接的随机值

时间:2015-07-31 02:33:08

标签: mysql performance mariadb

我有一个带有树表的数据库,

person: id, bio, name
book: id, id_person, title, info
file: id, id_book, location

其他信息:Book约为50,000行,File约为~300,000行。

我要做的是select 12位不同的作者和select只有一位bookbook从表中选择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。我会感谢任何帮助,尤其是帮助我以出色的表现来做到这一点。

1 个答案:

答案 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 ;