Выберите элемент из таблицы «многие ко многим», в котором есть все эти детали ... правильное решение? - PullRequest
0 голосов
/ 24 февраля 2010

(PHP / MySQL) Позвольте мне предисловие, сказав, что это работает, и что мне интересно, есть ли более чистый способ. Это кажется немного ... жестоким? И я не известен своим эффективным кодированием. : - /

TABLE (many-to-many)
scenid   mapid
  AA      01
  AA      02
  AA      04
  BB      01
  BB      04
  CC      02
  CC      03
  CC      05
  DD      01
  DD      02
  DD      03

Вы ищете сценарии, в которых есть ВСЕ эти карты: 01, 02, 03
(имея все + некоторые другие в порядке)

Мой текущий метод заключается в использовании этого запроса:

SELECT scenid, COUNT(scenid) FROM `TABLE`
WHERE mapid IN ( 01, 02, 03 )
GROUP BY scenid ORDER BY COUNT(scenid) DESC, scenid ASC

Что бы создать этот список:

scenid  COUNT
  DD      3
  AA      2
  CC      2
  BB      1

Затем в PHP я запускаю цикл while, который копирует сцены в новый массив до тех пор, пока COUNT по-прежнему == от общего числа mapids (в ​​данном случае 3). Это обрезает все результаты, которые содержат только некоторые из требуемых карт.

Опять же, , это работает. Но я все еще очень плохо знаком с MySQL и PHP (и это мои первые шаги в программировании), поэтому мне всегда интересно, работает ли мой " *"это чужое" ты видел, что идиот просто изобретает велосипед? lulz "

Есть ли лучший способ? Спасибо за ваше время.

1 Ответ

1 голос
/ 24 февраля 2010

Ваш запрос выглядит нормально, но вы можете выполнить фильтрацию в SQL, используя предложение HAVING:

SELECT scenid, COUNT(*)
FROM `TABLE`
WHERE mapid IN ( 01, 02, 03 )
GROUP BY scenid
HAVING COUNT(*) = 3
ORDER BY scenid ASC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...