Я кстати долго сейчас читал мануалы, и сам пришёл к тому, что написано у Вас) Правда, немного в конце допустил ошибку, использовав WHERE вместо HAVING, но такой вариант MySQL не принял, и выдал ошибку.
Одно только жаль - я сколько ни гуглил, вроде не нашёл способа посчитать длину списка динамически. Похоже, такое сделать невозможно. Было бы круто, если бы можно было, тогда от PHP требовался бы только список ID тегов, но не общее их число. Меньше теоретическая вероятность ошибок была бы.
Артём Каретников: не могли бы вы по шагам расписать, как это работает? Я вижу, тут перекрёстная ссылка: вложенный запрос ссылается на алиас из внешнего запроса. Но вложенный выполняется первым... Как в таком случае работает условие с алиасом?
Небольшой апдейт: считаем, что пары уникальны. Я вижу, это стало предметом недопонимания. В БД это не заложено, но это поддерживается бизнес-логикой, плодить одинаковые пары нет никакого смысла. Ну и да, можно создать индекс, который запретит добавление одинаковых пар.
Была ещё такая мысль - как-то посчитать количество найденных результатов через COUNT(*) и сравнить его с количеством переданных элементов (его можно статически вставить через PHP), но считать надо по каждому id_user... Возможно, что-то типа GROUP BY тут поможет. Но я такого никогда не делал, поэтому опять же, затруднюсь.
Александр Попов @popov654
Не очень понял... В вашем варианте во вложенном запросе будет куча неуникальных пар. Да, я понимаю, что это не принципиально, поскольку IN принимает список, а в списке неуникальные значения просто будут проигнорированы, грубо говоря. Спасибо за наводку. Но у меня главная сложность была с "И", а не с "ИЛИ". То есть мне нужно вернуть id пользователей, у которых встречаются теги с id 5 и 7. Значит вложенный запрос должен вернуть только те id, у которых есть две строки в таблице пар: (x, 5) и (x, 7), (y, 5) и (y, 7). Не важно, будут ли дубли, главное, что надо вернуть те айди, у которых есть две пары с заданными id тегов (или более), но не возвращать те, где всего одна из этих двух пар. Честно говоря, затрудняюсь сходу разгадать вашу загадку)
Судя по тому, что я читал про grid, он довольно сложен в понимании. Не так там всё интуитивно) flex-ы очень простые, но более старыми браузерами не поддерживаются увы.
Спасибо, заработало! Странно, раньше у меня в другом проекте вроде и float работал... Я думал, там главное, больше или меньше нуля. А оно вон как оказывается.
Но с return вы всё же не правы, сейчас проверил - работает и так, поскольку там по ссылке передача идёт.
xmoonlight: в теории - да, но это надо очень хорошо знать систему: какие модули, что качают, как этим воспользоваться.
Вот вам ещё простой пример: на моём древнем Android 2.3 не работает YouTube, просит обновить "сервисы Google Play". А при попытке их обновить они начинают пытаться что-то подгружать... И в итоге стандартный лаунчер от Сони раз в 15-20 секунд просто аварийно завершается. Запускается снова - и опять аварийно завершается. Приходится очень быстро идти в настройки, и останавливать этот процесс. Ну и после - удалять обновление.
Я это к чему - даже то, что качает, порой не может это делать так, чтобы не обрушивать систему. То есть эксплойты придётся искать в старых версиях модулей, а не в последних.
xmoonlight: кстати, этот кто-то должен быть автором приложения, установленного у меня в телефоне, или в сговоре с ним, что исключено. Я кстати даже от обновлений давно отказался по причине падения производительности в новых версиях (а кое-где из-за смены иконки/дизайна интерфейса).
John Smith: а вот интересно кстати, для самого банка есть какие-то риски такого анализа? Что можно сделать, обладая знаниями и инструментами? Я так понимаю, инициировать перевод от лица кого-то в свой адрес всё равно ведь не выйдет (токены при авторизации формирует сервер в любом случае)?
Неужели так велика вероятность поставить приложение со сканером файлов? Оно ведь ещё и формат базы данных с паролями должно знать, и мастер-пароль тоже (база обычно шифруется). Вы сейчас запугаете человека до смерти, а на самом деле зря, я уже два с лишним года живу с рутом, и всё окей (правда, пароли на смартфоне не храню, ибо нет потребности, и приложений новых не ставлю никаких давно).
У меня потребность в root доступе была, и ещё какая. Без него не удалить предустановленный производителем софт, например. Для SonyEricsson Pro, например (где всего 512 Мб встроенной памяти на всё про всё) это возможность удалить McAffee Security и Moxier (почтовая программа), что освобождает кучу места. Не говоря уже о возможности удалять системные компоненты, принудительно ставить любимую версию Google Play, полноценно использовать Titanium Backup со всеми его возможностями, и прочее, и прочее.
На более новых трубках без рута тоже удаляется далеко не всё, к слову.
Ankhena W: спасибо, я просто думаю, стоит ли изучать эту модную технологию.
Как я понимаю, табличная вёрстка - это плюс в плане простоты и универсальности, хоть и уменьшает свободу для дизайнера (если изначально рисовать под сетку). А вот по второму пункту полностью согласен... Довелось однажды сайт, собранный на Бутстрапе, руками допиливать. Тот ещё кошмар. Огромная вложенность, невнятные по смыслу CSS классы... А ещё 2-3 версии JQuery, подключенные сразу, и 3-4 неиспользуемых плагина, подключенных "про запас", и дающих ещё больше тормозов :)