Mysql — Избегайте Cross Join, чтобы не получить несколько повторяющихся данных

У меня есть две таблицы, из которых я хотел бы получить результаты без перекрестного соединения для получения дубликатов данных.

Таблица 1: booksCheckedOut

row    |   userID   |      book    |  date
-------------------------------------------------
1      |    3       |      book1   |  Jan-26
2      |    3       |      book2   |  Jan-27
3      |    3       |      book3   |  Jan-28
4      |    3       |      book4   |  Jan-29

Table2: numberOfPagesRead

row     |    userID   |     name        |   date       |   pagesRead
-----------------------------------------------------------------
1       |    3        |     John        |   Jan-26     |   4
2       |    3        |     John        |   Jan-27     |   7
3       |    3        |     John        |   Jan-28     |   8

Я делаю SQL-запрос, который выглядит следующим образом:

select booksCheckedOut.book, numberOfPagesRead.pagesRead

from booksCheckedOut, numberOfPagesRead

where booksCheckedOut.userID='3' and numberOfPagesRead.userID='3'

Но я получаю результаты, которые выглядят так: Строки умножаются (4 x 3 = 12 результатов)

book       |  pagesRead |
-------------------------
book1      |    4       |
book1      |    7       |
book1      |    8       |
book2      |    4       |
book2      |    7       |
book2      |    8       |
book3      |    4       |
book3      |    7       |
book3      |    8       |
book4      |    4       |
book4      |    7       |
book4      |    8       |

Это то, что я хочу:

book       |  pagesRead |
-------------------------
book1      |    4       |
book2      |    7       |
book3      |    8       |
book4      |            |

Как предотвратить умножение результатов (перекрестное соединение)?

Я знаю, что это не имеет смысла, но я не хочу связывать количество прочитанных страниц с конкретной книгой, это просто способ, которым текущая база данных уже настроена.

Заранее спасибо!

1

Решение

Казалось бы, UserId а также date ключи, соединяющие эти таблицы:

select co.book, nopr.pagesRead
from booksCheckedOut co join
numberOfPagesRead nopr
on co.userId = nopr.UserId and co.date = nopr.date
where co.userID = '3';

Вы должны научиться правильно join синтаксис. Простое правило: Никогда используйте запятые в from пункт.

Я добавил псевдонимы таблиц; сделать запросы легче писать и читать.

2

Другие решения

Других решений пока нет …