我正在尝试创建图书目录。我有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。我想了解此查询所执行的操作,包括单词或其他内容。
*如果我的问题没有被正确询问!编辑我! *问候!
答案 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,除非我遗漏了某些内容,否则我认为没有任何意义