Выберите одинаковые пары значений из двух таблиц

#mysql #qsqlquery

#mysql #qsqlquery

Вопрос:

В моей базе данных есть 4 таблицы MySQL:

  1. Users (uid, имя)
  2. Shops (shopId, shopName)
  3. Reviews (Идентификатор обзора, текст, идентификатор пользователя, идентификатор магазина, скорость, дата)
  4. TransactionHistory (Идентификатор транзакции, идентификатор пользователя, идентификатор магазина, сумма, дата)

Пользователи пишут свои комментарии к магазинам в Reviews таблице. И история платежей пользователей в некоторых магазинах сохраняется в TransactionHistory таблице.

Мне нужно выбрать отзывы всех пользователей за некоторый период времени, если эти пользователи совершали платежи в этом магазине за тот же период времени.

  1. Select userId, shopId, rate, text, date from Review where date between "01.01.2019" and "01.02.2019" where shopId in (select distinct(shopId) from Shops)

  2. Select userId, shopId, date from TransactionHistory where date between "01.01.2019" and "01.02.2019"

Итак, у меня есть два результирующих набора, и некоторые записи имеют одну и ту же пару (userId, shopId) — это то, что я хочу получить: все записи из 1 SQL-запроса, какие пары (userId, shopId) присутствуют в 2 SQL-запросе.

Ответ №1:

Если я правильно понял, все, что вам нужно, это оператор соединения, подобный этому:

    SELECT * FROM t1 LEFT JOIN (t2, t3, t4)
                 ON (t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c)
  

Вот ресурс https://dev.mysql.com/doc/refman/8.0/en/join.html

В вашем случае внутри оператора on будет то, что вы хотите, чтобы быть равным.

 Select userId, shopId, rate, text, date from Review r join TransactionHistory th on (r.userId == th.userId and r.shopId == th.shopId) where r.date between "01.01.2019" and "01.02.2019" where r.shopId in (select distinct(shopId) from Shops)
  

Ответ №2:

 SELECT u.uid, u.name as userName, u.surname, s.name, rate, review, c.amount FROM `rsamazingapp.rsamazingapp.reviews` as r 
INNER JOIN `rsamazingapp.cashbacks` as c ON (r.uid = c.uid and r.shop_id = c.shop_id) 
INNER JOIN `rsamazingapp.shops` as s on (r.shop_id = s.shop_id)
INNER JOIN `rsamazingapp.users` as u on (r.uid = u.uid)
where r.shop_id in (select distinct shop_id from `rsamazingapp.shops`)
order by rate desc