代码之家  ›  专栏  ›  技术社区  ›  Julien

同一字段上的SQL双击(mysql或sqlite3)

  •  2
  • Julien  · 技术社区  · 15 年前

    我有一个我解决不了的问题!(sqlite3,但我认为它与MySql相同) 我有这些表(图):

    alt text http://www.radarkiller.fr/blog/bddprobleme.png

    我想找到所有去两条不同街道的公交线路(带有类型和编号),我有街道id(例如12和14)。

    结果应向客户提供城市中从12号街到14号街的所有公交线路(id、类型和编号)(示例)。

    就像拉里·卢斯蒂格说的,你可以用两个外键走捷径。

    2 回复  |  直到 15 年前
        1
  •  4
  •   OMG Ponies    15 年前

    使用分组/计数:

      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
    

    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
  •  2
  •   OMG Ponies    15 年前

    假设您希望在示例结果集中有三条单独的记录,并且假设所有“邻域_id”列都是返回邻域表的FKs,请尝试:

    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);