【问题标题】:MySQL JOIN query with conditions带条件的 MySQL JOIN 查询
【发布时间】:2014-05-19 15:15:28
【问题描述】:

目前的数据库结构包括:

  1. 国家/地区(country_id、country_name)
  2. 城镇(town_id、country_id、town_name)
  3. 地区(area_id、town_id、area_name)
  4. 车站(station_id、area_id、station_name)
  5. 优惠(offer_id、offer_name、车站)

报价表中的站点列包含以下格式的站点 ID:

|station_id_1|station_id_2|station_id_4|......|

我对 JOINED 查询非常熟悉,但在这种情况下,很难创建一个查询,该查询可以 COUNT(country_id) FROM countries OR town_id FROM 实际有报价的城镇...我如何加入车站列 FROM 报价表与实际站一起以便之后加入较低级别的表?这可能吗?

提前谢谢你

【问题讨论】:

  • 我删除了我的答案,您应该添加 n-to-n 表 offers_stations (offer_id, station_id) 并连接优惠和车站。保持这样的station_id_1|station_id_2|station_id_4 永远不会很好。

标签: mysql join


【解决方案1】:

以下查询将为您提供不同数量的国家/地区提供优惠。 OffersStations 表使用 LIKE 运算符连接,如下所示:

SELECT
    COUNT(DISTINCT country_id)  
FROM
    Offers O
INNER JOIN Stations S
ON O.stations LIKE '%'||S.station_id||'%'
INNER JOIN Areas A
ON S.area_id = A.area_id
INNER JOIN Towns T
ON A.town_id = T.town_id
INNER JOIN Countries C
ON T.country_id = C.country_id;

但是,就像 Peter 所建议的那样,不建议以串联格式存储 station_id 数据。

【讨论】:

  • 关于信息,为什么需要使用 LIKE 运算符?
  • @Simon 尽管它不是推荐的数据库设计,但是站列当前包含数据,例如'station_id_1|station_id_2|station_id_4'。为了匹配其中包含的任何 station_id,使用 LIKE。
  • 工作就像一个魅力。但是它需要 COUNT(DISTINCT countries.country_id)。非常感谢@JosephB 和大家的帮助。下次会记住使用单独的记录以避免连接格式。
  • 作为记录,经过多次测试(以及更多研究),我已将 LIKE '%'||S.station_id||'%' 替换为 LIKE CONCAT('%|', S. station_id, '|%') 成就了这一天:-)
  • @NickZulu 是的,使用 CONCAT 是一种更好的连接方式。
【解决方案2】:

为了扩展@Peter 的评论,您确实有一个中间表的案例。原因是一个站可能有多个报价,并且一个报价可能适用于多个站。因此,如果您以后希望在 offer 表中存储其他列,则此数据将在整个表中重复。如果您希望更新任何信息,通过添加中介进行规范化将最大限度地减少这种重复并减少开销 - 例如。提供折扣等。

感谢@Joseph B,他的查询将变成这样:

SELECT
    COUNT(DISTINCT country_id)  
FROM
    Offers O
INNER JOIN Offers_Stations OS
ON OS.offer_id = O.offer_id
INNER JOIN Stations S
ON OS.station_id = S.station_id
INNER JOIN Areas A
ON S.area_id = A.area_id
INNER JOIN Towns T
ON A.town_id = T.town_id
INNER JOIN Countries C
ON T.country_id = C.country_id;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-05
    • 1970-01-01
    • 2011-02-15
    • 2012-08-01
    相关资源
    最近更新 更多