SQL двойной SELECT в одном поле (mysql или sqlite3) - PullRequest
2 голосов
/ 09 октября 2009

У меня есть проблема, которую я не могу решить! (sqlite3, но я думаю, что это будет так же, как MySql) У меня есть эти таблицы (изображение):

альтернативный текст http://www.radarkiller.fr/blog/bddprobleme.png

И я хотел бы найти все автобусные линии (с типом и номером), которые идут на две разные улицы, с которых у меня есть street_id (12 и 14 для примера).

В результате клиент получает все автобусные линии (идентификатор, тип и номер) в городе, которые идут от улицы № 12 до улицы № 14 (пример).

Как сказал Ларри Люстиг, вы можете сделать ярлык с двумя соседними внешними ключами.

Заранее благодарю за помощь!

Ответы [ 2 ]

4 голосов
/ 09 октября 2009

Использование GROUP BY / COUNTING:

  SELECT t.bus_line_id,
         t.bus_line_type,
         t.bus_line_number
    FROM BUS_LINE t
    JOIN LINK_BUS_NEIGBOURHOOD lbn ON lbn.bus_line_id = t.bus_line_id
    JOIN LINK_NEIGHBOURHOOD_STREET lns ON lns.neighbourhood_id_ns = lbn.neighbourhood_id_ns
    JOIN STREET s ON s.street_id = lns.street_id
   WHERE s.street_id IN (12, 14)
GROUP BY t.bus_line_id,
         t.bus_line_type,
         t.bus_line_number,
         s.street_id
  HAVING COUNT(DISTINCT s.street_id) = 2

Использование JOIN:

SELECT t.bus_line_id,
       t.bus_line_type,
       t.bus_line_number
  FROM BUS_LINE t
  JOIN LINK_BUS_NEIGBOURHOOD lbn ON lbn.bus_line_id = t.bus_line_id
  JOIN LINK_NEIGHBOURHOOD_STREET lns ON lns.neighbourhood_id_ns = lbn.neighbourhood_id_ns
  JOIN STREET s ON s.street_id = lns.street_id
               AND s.steet_id = 12
  JOIN STREET s2 ON s2.street_id = lns.street_id
                AND s2.steet_id = 14
2 голосов
/ 09 октября 2009

Предполагая, что вам нужно три отдельных записи в вашем выборочном результирующем наборе, и предполагая, что все столбцы "окрестности_идейства" являются FK назад к таблице соседства, попробуйте:

SELECT * 
  FROM bus_line 
 WHERE EXISTS (SELECT * 
                 FROM neighborhood N 
           INNER JOIN link_neighborhood_street S ON N.neighborhood_id = S.neighborhood_id_ns 
                WHERE S.street_id = 12) 
  AND EXISTS (SELECT * 
                FROM neighborhood N 
          INNER JOIN link_neighborhood_street S ON N.neighborhood_id = S.neighborhood_id_ns 
               WHERE S.street_id = 14);
...