Как написать запрос SQL для выбора элемента по его характеристикам?

Мучаюсь второй день, наведите на мысль пж.

Суть задачи:
Мне нужно вытащить строку из таблицы page, зная только iCityID, при этом значений iCityID может быть несколько.

Примеры:
Пример 1: Имею значения iCityID = 101 и 102. На выходе нужно получить Первую страницу. При этом 101 также принадлежит и Вротой странице, но ее вытаскивать не надо, так как нет точного совпадения.
Пример 2: Имею значения iCityID = 101. На выходе нужно получить Вторую страницу. При этом 101 также принадлежит и Первой странице, но ее вытаскивать не надо, так как у нее есть еще и другой iCityID (102).

Структура БД:

Таблица: page
iPageIDsPageName
1Первая страница
2Вторая страница
3Третья страница

Таблица: city
iCityIDsCityName
101Москва
102Санкт-Петербург
103Казань
104Ярославль
105Владивосток

Таблица связки: page_city
iPageIDiCityID
1101
1102
2101
3103
3105
  • Вопрос задан
  • 252 просмотра
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Если пара (iPageID, iCityID) уникальная, то
SELECT * 
    FROM (
        SELECT `iPageID`
            FROM `page_city`
            WHERE `iCityID` IN (101, 102)
            GROUP BY `iPageID`
            HAVING COUNT(*) = 2
    ) AS `t1`
    JOIN (
        SELECT `iPageID`
            FROM `page_city`
            GROUP BY `iPageID`
            HAVING COUNT(*) = 2
    ) AS `t2` USING (`iPageID`)

(Поправил, сначала второе условие не заметил).
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
goshaviz
@goshaviz
Гаджетоман
В конце запроса по выборке из 'page_city' ставить LIMIT 1.
А в самом запросе, в зависимости от того какая страница нужна, первая или вторая, ставить ORDER.
Например
SELECT iPageID FROM page_city WHERE iCityID=101 ORDER BY iPageID ASC LIMIT 1

Если я правильно понял задачу...
Ответ написан
@faustxp
SELECT page_city.iPageID,
       COUNT(page_city.iCityID)
  FROM (
        SELECT iPageID,
               COUNT(iCityID)       cnt
          FROM page_city
         GROUP BY iPageID
       )                      cnt_page,
       page_city
 WHERE cnt_page.iPageID = page_city.iPageID 
   AND page_city.iCityID IN (:LIST)
 GROUP BY iPageID
 HAVING COUNT(iCityID) = cnt_page.cnt;

Хотя проблему первого запроса не решит
Ответ написан
Комментировать
@StrannikF
О самой задаче маловато данных.
Вот попробуйте так:

DECLARE id1 int, id2 int
Пример 1
SET id1 = 101
SET id2 = 102

Пример 2
SET id1 = 101
SET id2 = 101

SELECT case when id1 <> id2 then min(iPageID) else max(iPageID) end
FROM page_city
WHERE iCityID IN(@Id1,@Id2)
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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