MySQL JOIN查询条件

时间:2014-05-19 15:15:28

标签: mysql join

当前的数据库结构包括:

  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,电台)
  6. 表中的“站点”列包括以下格式的站点ID:

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

    我对JOINED查询非常熟悉,但在这种情况下很难创建一个可以COUNT(country_id)来自FROM国家的单个查询或者来自实际有要约的城镇的城镇...我怎么能加入站列FROM提供表与实际站点之后为了加入更低级别的表格?这有可能吗?

    提前谢谢

2 个答案:

答案 0 :(得分:0)

以下查询将为您提供具有优惠的不同国家/地区数量。使用Offers运算符加入StationsLIKE表格,如下所示:

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数据。

答案 1 :(得分:0)

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

归功于@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;