Задать вопрос
wtf_object
@wtf_object

Проверить существует ли запись в другой таблице?

Всем привет! Помогите решить задачу: необходимо осуществить поиск по таблице артистов, а так же если пользователь подписан на артиста (который попал в поисковый запрос), то нужно добавить поле subscribed с значением true, если подписан, иначе false

У меня есть 2 таблицы:
1. таблица артистов
select * from artists limit 5;
+----------------------------------+
| name                             |
+----------------------------------+
| Dillon Francis & Skrillex        |
| King Skrilla                     |
| RL Grime, What So Not & Skrillex |
| Skrillex                         |
| Skrillex & Diplo                 |
+----------------------------------+
13 rows in set (0.000 sec)


2. таблица подписок пользователей на артистов.
select * from subscriptions limit 5;
+-------+----------------------+-------------+
| id    | user_name            | artist_name |
+-------+----------------------+-------------+
| 47977 |        user1         | #####       |
| 47978 |        user2         | (hed) p.e.  |
| 47979 |        user1         | 2 Unlimited |
| 47980 |        user2         | 22-20s      |
| 47981 |        user3         | 25/17       |
+-------+----------------------+-------------+


Для поиска артиста использую where + like
select * from artists where name like '%skrill%';

Но вот как проверить подписан ли пользователь на артистов, которые попали в выборку по like %XXX%? Насколько я понимаю нужно копать в сторону join.
Я добавил джоин и фильтр по пользователю, но теперь из-за него, поиск по артистам поломался и выдаёт результаты только если пользователь подписан.
select * from artists where name like '%skrill%';
+----------------------------------+
| name                             |
+----------------------------------+
| Dillon Francis & Skrillex        |
| King Skrilla                     |
| RL Grime, What So Not & Skrillex |
| Skrillex                         |
| Skrillex & Diplo                 |
| Skrillex & GTA                   |
| Skrillex & Kendrick Lamar        |
| Skrillex & MUST DIE!             |
| Skrillex & Poo Bear              |
| Skrillex & Rick Ross             |
| Skrillex & The Doors             |
| Wiwek & Skrillex                 |
| Yogi & Skrillex                  |
+----------------------------------+
13 rows in set (0.000 sec)


select * from artists LEFT JOIN subscriptions d ON name=artist_name where artist_name like '%skrill%' and user_name='objque@me';
+----------------------------------+-------+-----------+----------------------------------+
| name                             | id    | user_name | artist_name                      |
+----------------------------------+-------+-----------+----------------------------------+
| Dillon Francis & Skrillex        | 55268 | objque@me | Dillon Francis & Skrillex        |
| RL Grime, What So Not & Skrillex | 55781 | objque@me | RL Grime, What So Not & Skrillex |
| Skrillex & GTA                   | 55857 | objque@me | Skrillex & GTA                   |
| Skrillex & Kendrick Lamar        | 55858 | objque@me | Skrillex & Kendrick Lamar        |
| Skrillex & MUST DIE!             | 55859 | objque@me | Skrillex & MUST DIE!             |
| Skrillex & Rick Ross             | 55860 | objque@me | Skrillex & Rick Ross             |
| Skrillex                         | 55861 | objque@me | Skrillex                         |
| Wiwek & Skrillex                 | 56023 | objque@me | Wiwek & Skrillex                 |
| Yogi & Skrillex                  | 56030 | objque@me | Yogi & Skrillex                  |
+----------------------------------+-------+-----------+----------------------------------+
9 rows in set (0.000 sec)


Беда в том, что всего по поиску выдаётся 13 строк, а если делать join по artist_name=name, то остаётся 9 строк.
  • Вопрос задан
  • 723 просмотра
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 2
taliban
@taliban
php программист
join исключает записи которые не совпадают по условию
left join добавляет запсиси из смежной таблицы как null при условии несовпадения
Дальше все в ваших руках
Ответ написан
@morricone85
select * from artists LEFT JOIN subscriptions d ON name=artist_name where artist_name like '%skrill%' and user_name='objque@me';
+----------------------------------+-------+-----------+----------------------------------+
| name | id | user_name | artist_name |
+----------------------------------+-------+-----------+----------------------------------+
| Dillon Francis & Skrillex | 55268 | objque@me | Dillon Francis & Skrillex |
| RL Grime, What So Not & Skrillex | 55781 | objque@me | RL Grime, What So Not & Skrillex |
| Skrillex & GTA | 55857 | objque@me | Skrillex & GTA |
| Skrillex & Kendrick Lamar | 55858 | objque@me | Skrillex & Kendrick Lamar |
| Skrillex & MUST DIE! | 55859 | objque@me | Skrillex & MUST DIE! |
| Skrillex & Rick Ross | 55860 | objque@me | Skrillex & Rick Ross |
| Skrillex | 55861 | objque@me | Skrillex |
| Wiwek & Skrillex | 56023 | objque@me | Wiwek & Skrillex |
| Yogi & Skrillex | 56030 | objque@me | Yogi & Skrillex |
+----------------------------------+-------+-----------+----------------------------------+
9 rows in set (0.000 sec)


а, что тут не так? поле user_name из какой таблицы?
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы