具有3个INNER JOIN的MYSQL查询

时间:2014-08-30 20:55:08

标签: php mysql join

Here's an img with 3 JOINs Here's an img with only 1 JOIN我正在尝试创建图书目录。我有3个基本表 - 书籍,作者,books_authors;

+------------+--------------+------+-----+---------+----------------+
| Field      | Type         | Null | Key | Default | Extra          |
+------------+--------------+------+-----+---------+----------------+
| book_id    | int(11)      | NO   | PRI | NULL    | auto_increment |
| book_title | varchar(250) | NO   |     | NULL    |                |
+------------+--------------+------+-----+---------+----------------+

作者

+-------------+--------------+------+-----+---------+----------------+
| Field       | Type         | Null | Key | Default | Extra          |
+-------------+--------------+------+-----+---------+----------------+
| author_id   | int(11)      | NO   | PRI | NULL    | auto_increment |
| author_name | varchar(250) | NO   |     | NULL    |                |
+-------------+--------------+------+-----+---------+----------------+

books_authors

+-----------+---------+------+-----+---------+-------+
| Field     | Type    | Null | Key | Default | Extra |
+-----------+---------+------+-----+---------+-------+
| book_id   | int(11) | NO   | MUL | NULL    |       |
| author_id | int(11) | NO   | MUL | NULL    |       |
+-----------+---------+------+-----+---------+-------+

我有一个查询,它会获取每本书的书名和所有作者,并显示结果:

$booksAndAuthors = mysqli_query($connection, 'SELECT * FROM books LEFT JOIN books_authors ON books.book_id=books_authors.book_id LEFT JOIN authors ON authors.author_id=books_authors.author_id');

它返回:

Book Name -> Author 1, Author 2
Book Name 2 -> Author 3, Author 2

等等。

我还有另一个问题:

$booksAndAuthors = mysqli_query($connection, 'SELECT * FROM books_authors as ba 
                                                      INNER JOIN books as b ON ba.book_id=b.book_id
                                                      INNER JOIN books_authors as booaut ON booaut.book_id=ba.book_id 
                                                      INNER JOIN authors as a ON booaut.author_id=a.author_id
                                                      WHERE ba.author_id=' . $author_id);

当我点击作者(作者是链接)时,查询会返回作者的所有书籍;查询全部有效;

我的问题是:

有人可以向我解释为什么我要把桌子与自己进行比较。就像我自己一样解释dummie。我想了解此查询所执行的操作,包括单词或其他内容。

*如果我的问题没有被正确询问!编辑我! *问候!

2 个答案:

答案 0 :(得分:1)

一本书可以有多个作者。自我联接的目的是找到这本书的其他作者。

FROM books_authors as ba 
...
INNER JOIN books_authors as booaut ON booaut.book_id=ba.book_id
...
WHERE ba.author_id=42

联盟选择与作者42共同撰写图书的任何作者。

编写查询的另一种方法:

FROM books_authors as ba 
...
WHERE   EXISTS
        (
        SELECT  *
        FROM    books_authors ba2
        WHERE   ba2.book_id = ba.book_id
                and ba2.author_id = 42
        )

这就是说,选择作者42中存在匹配的book_authors条目的所有行。

答案 1 :(得分:0)

由于您选择相同的行,因此此处似乎不需要自联接(将表连接到自身)。

通常执行自连接以连接表中的两个不同的行。例如,如果您有一个包含月度帐户余额的表格,例如

acount_id  |as_of_date | balance_amount
-----------|---------------------------
12213      |2014-01-01 | 10000
12213      |2014-02-01 | 20000
12213      |2014-03-01 | 25000

假设表名为monthly_account_balances

现在您要计算每月余额之间的差异

例如,在2月到1月之间,差异是20000 - 10000 = 10000 在3月到2月之间,差异是25000 - 20000 = 5000

您需要的输出是

acount_id  |as_of_date | balance_amount|difference
-----------|-----------|---------------|-------------
12213      |2014-01-01 | 10000         | null
12213      |2014-02-01 | 20000         | 10000
12213      |2014-03-01 | 25000         | 5000

您可以按照以下方式进行自我加入:

select a.*, b.balance_amount - a.balance_amount as difference
from monthly_account_balances a 
inner join monthly_account_balances b on a.account_id = b.account_id
    and a.as_of_date + interval '1 month' = b.as_of_date

注意日期条件。它正在比较具有相同id但不同as_of_date的两个不同记录。在这种情况下,自我联接很有用。

但是在你的情况下,你只是加入了id,除非我遗漏了某些内容,否则我认为没有任何意义