0

これらのクエリを使用して、同様の書籍を読んだユーザーの 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 に対して、 from も必要emailですusers。そして、そのユーザーの read からのすべての book_ids ですが、これらの book_ids は ID であり、book_ids に基づいて本から本を表示したいと考えています。

うわー、誰か私が書いたことを理解してくれますか?

:L)

4

2 に答える 2

0

これを試して

    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
于 2013-10-30T11:31:31.283 に答える
0

これを試して。うまくいけば、構文エラーはありません。うまくいかない場合は、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
于 2013-10-30T11:33:35.737 に答える