2014年8月24日 星期日

多對多的關聯建立與查詢-MySQL為例

在做專案的同時,探討到一個問題,該如何建立多對多的關聯Table並下query查詢呢?
我們想假設一個情況:我正在維護一個系統而裡頭有許多筆玩家的資料皆存在Players這張TABLE,而玩家的目的就是在收集優待券(存在Coupon這張TABLE),而一個玩家會有很多Coupons,相對地同一Coupon也會被許多玩家擁有,那麼該如何建立這種都對多關聯呢?


首先我運行的資料庫版本是 MySQL 5.5.36,以下SQL是用來建立上述問題的TABLE。
CREATE TABLE Players(
 p_id INT NOT NULL,
 p_name VARCHAR(20) NOT NULL,
 p_createDate TIMESTAMP NOT NULL,
 PRIMARY KEY(p_id)
);

CREATE TABLE Coupons(
 c_id INT NOT NULL auto_increment,
 c_description TEXT NOT NULL,
 c_photoLink VARCHAR(25),
 PRIMARY KEY(c_id)
);

CREATE TABLE PlayerOfCoupon(
 playerId INT NOT NULL REFERENCES Players (p_id) ON DELETE CASCADE,
 couponId INT NOT NULL REFERENCES Coupons (c_id) ON DELETE CASCADE
);
在PlayerOfCoupon的建立SQL裡,可以發現我們使用ON DELETE CASCADE,主要是因為假設當Players或Coupons裡的某一筆資料若被刪除,那麼PlayerOfCoupon裡有參考到這筆資料的部分也該被刪除。

而下面這段則是查詢的SQL,運用Inner Join去Join Players 跟 Coupons這兩張表格並取出想要的欄位資訊。
SELECT PlayerOfCoupon.*,
    Players.p_name AS playerName,
    Coupons.c_description AS CouponDesc
FROM Players
INNER JOIN (PlayerOfCoupon
    INNER JOIN Coupons
    ON PlayerOfCoupon.couponId = Coupons.c_id
)
ON PlayerOfCoupon.playerId = Players.p_id

沒有留言:

張貼留言