azerphoenix
@azerphoenix
Java Software Engineer

Как итерировать в операторе WHERE используя данные из второй таблицы?

Доброго времени суток!

Задача наверное, не стандартная... Хотелось бы узнать, как лучше решить ее, чтобы не изменять структуру БД и стоит ли так использовать.
Вкратце: есть 2 таблицы payment_methods & user_meta.

payment_methods
+-----+-----------------+
| ID  |  Payment System |
+-----+-----------------+
| 563 | webmoney        |
| 564 | yandex money    |
| 565 | paypal          |
+-----+-----------------+


user_meta
+-----+----------------+---------+---------+
| ID  | payment system | wallet  | USER_ID |
+-----+----------------+---------+---------+
| 739 | webmoney       | 14njn   |     736 |
| 740 | paypal         | dnjanja |     736 |
+-----+----------------+---------+---------+


Мне нужно получить список всех возможных методов оплаты пользователя, но чтобы не перечислять в SQL запросе все строки из payment system в WHERE, хотелось бы в WHERE итерировать по названию платежных систем из первой таблицы payment_methods

Простой SQL запрос вида
SELECT * FROM `USER_META` WHERE `META_KEY` = 'webmoney' AND USER_ID = 736;

А как сделать, чтобы вместо WHERE `META_KEY` = 'webmoney' итерировался из 1-й таблицы на основе колонки payment_methods? И насколько корректно данная реализация?

P.S. Используется БД MySQL + Spring Boot
  • Вопрос задан
  • 71 просмотр
Решения вопроса 2
Beshere
@Beshere
Разработчик
Конечно, сделано неправильно. В таблице user_meta поле payment system должно указывать на payment_methods.id.

А так примерно

SELECT * FROM `USER_META` WHERE USER_ID = 736 AND `META_KEY` IN (SELECT 'PAYMENT_SYSTEM' FROM 'PAYMENTS_METHODS')
Ответ написан
ShelestovAnt
@ShelestovAnt
Верстаю и программирую
SELECT * FROM `USER_META` WHERE 
     `payment_system` in (SELECT `payment_system` FROM payment_methods)
     AND USER_ID = 736;
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
azerphoenix
@azerphoenix Автор вопроса, куратор тега Spring
Java Software Engineer
Вроде бы и этот вариант рабочий:
SELECT * FROM `USER_META` t1
INNER JOIN `PAYMENT_METHODS` t2 ON t1.META_KEY = t2.PAYMENT_SYSTEM
WHERE USER_ID = 736;

Результат:
5c7e73dbe95d0970971186.png
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы