[英]getting data from multiple tables in single query -mysql
我使用這些查詢來選擇已選擇相似書籍的用戶的user_id。
SELECT r2.user_id
FROM `read` r1
JOIN `read` r2
ON r1.user_id <> r2.user_id AND r1.book_id = r2.book_id
WHERE r1.user_id = 1
GROUP BY r2.user_id
HAVING count(*) >= 5
但是我不想簡單地顯示user_id。 而且還有其他表中有關此user_id的數據!
上面的查詢僅使用此表:
CREATE TABLE `read` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`user_id` int(11) unsigned NOT NULL,
`book_id` int(11) unsigned NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `No duplicates` (`user_id`,`book_id`),
KEY `book_id` (`book_id`),
CONSTRAINT `connections_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `connections_ibfk_2` FOREIGN KEY (`book_id`) REFERENCES `books` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
但我也有:
CREATE TABLE `users` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`email` char(255) NOT NULL DEFAULT '',
`password` char(12) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `email` (`email`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
和
CREATE TABLE `books` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`book` char(55) NOT NULL DEFAULT '',
`user_id` int(11) unsigned NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `book` (`book`),
KEY `user_id` (`user_id`),
CONSTRAINT `books_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE NO ACTION ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
因此,對於我的查詢生成的列表中的每個user_id,我也希望email
來自users
email
。 並且所有book_ids都來自該用戶的read,但是這些book_ids是id,我希望顯示基於book_ids的書中的書。
哇,有人知道我寫的嗎?
:L)
嘗試這個
SELECT r2.user_id,u1.email,b1.books
FROM `read` r1
JOIN `read` r2
ON r1.user_id <> r2.user_id AND r1.book_id = r2.book_id
JOIN `users` u1
ON r2.user_id =u1.id
JOIN `books` b1
ON r1.book_id=b1.id
WHERE r1.user_id = 1
GROUP BY r2.user_id
HAVING count(*) >= 5
嘗試這個。 希望沒有語法錯誤。 如果不起作用,請訪問SQLFiddle.com並加載一些測試數據
SELECT users.id, users.email, book.books
FROM (
SELECT r2.user_id
FROM `read` r1
JOIN `read` r2
ON r1.user_id <> r2.user_id
AND r1.book_id = r2.book_id
WHERE r1.user_id = 1
GROUP BY r2.user_id
HAVING count(*) >= 5) as t1
JOIN users
ON t1.user_id = users.id
JOIN read
ON read.user_id = t1.user_id
JOIN books
ON books.id = read.book_id
WHERE EXISTS(SELECT *
FROM read
WHERE read.user_id = 1
AND read.book_id = book.id)
總結列表-按書籍的降序排列:
SELECT users.id, users.email, t1.qty, GROUP_CONCAT(book.books)
FROM (
SELECT r2.user_id, COUNT(*) AS qty
FROM `read` r1
JOIN `read` r2
ON r1.user_id <> r2.user_id
AND r1.book_id = r2.book_id
WHERE r1.user_id = 1
GROUP BY r2.user_id
HAVING count(*) >= 5) as t1
JOIN users
ON t1.user_id = users.id
JOIN read
ON read.user_id = t1.user_id
JOIN books
ON books.id = read.book_id
WHERE EXISTS(SELECT *
FROM read
WHERE read.user_id = 1
AND read.book_id = book.id)
GROUP BY users.id, users.email, t1.qty
ORDER BY t1.qty DESC, users.email ASC
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.