Исключить записи из таблицы, и выбрать оставшиеся
create table podpis ( id int,
id_podpis int,
id_user int,
type enum('tag', 'news') );
insert into main values
(1, 44, 3, 'tag'),
(2, 75, 1, 'news'),
(3, 66, 1, 'tag');
SELECT * FROM `podpis` where (`id_podpis` = '75' and `types` = 'news') or (`id_podpis` in('44,66') and `type` = 'tag') ORDER BY `type` = 'news' DESC
В результате получим
id id_podpis id_user type
2 75 1 news
1 44 3 tag
3 66 1 tag
Есть таблица подписок, есть id новости и id тегов. Сперва выбираем записи с типом news. В результате необходимо отправить уведомление пользователю с id id_user = 1, дважды. То есть сперва отправляем уведомление одному и тому же ползователю о том, что есть обновления у новости, затем что есть обновления у тега. Тег который закреплен за id новости. Не суть, дважды отправляем уведомление одному пользователю
Как решаю вопрос, в цикле
while($r = $db->get_row())
if(!$us_pod[($r['type'] == 'tag' ? "news" : "tag")][$r['id_us']])
$us_pod[$r['type']][$r['id_us']] = $r['id_us'];
Необходимо собрать id пользователей в массив, предварительно разделив на 2 подмассива. Один по тегам, другой по новостям. Чтобы не отправить дважды уведомление одному и тому же пользователю. В условии выставляю проверку, если в массиве отсутствует значение. Плюсуем еще значение в массив.
Задача решена, есть ммассив по тегам и есть массив по новостям. В обеих массивах все значения уникальны, то есть их нет во втором или в первом.
Сортировка по новостям в приоритете. То есть если опубликована новость, то и уведомление у пользователя будет соответствующее, не так, что опубликована новая публикация по теггу, тогда когда пользователь уже подписан на данный источник.
Вопрос
Возможно ли сразу условие в цикле перенести в логику запроса? То есть выбрать подписчиков сперва на источник и исключить записи подписок на теги с тем же id user, а затем выбрать записи подписок на тегов id пользователей которые не подписаны как на новость?
Убрать условие из цикла...