請問我該如何使用set資料形態?

edited 十月 2013 in 進階PHP討論
1.我想寫一個學校的運動會報名網頁,一個報名選手可報多種以上的項目(如100公尺、200公尺等),在選手的報名的欄位中,我該分成多種位較好?,還是用一個欄位包含多項呢?我希望往後能快速的找出一個選手的報名項目,也能找出一個項目的報名選手??
2我看到特別資的資料型態中,有"set"這個,說常用在複選或購物中,但不知如何使用,不知要去那個地方找這個資料型態的範例?
謝謝~~~

原始討論: http://twpug.net/x/modules/newbb/viewtopic.php?topic_id=2342

評論

  • edited 十二月 2006
    1.
    分成多種位較好?,還是用一個欄位包含多項呢?<=看不懂什麼意思
    要做資料的統計分析,建議先想清楚顯示的方式,像是要顯示在同一頁或分成多頁?這些決定了才能知道哪種的sql語法最適合

    2.
    mysql的Documentation說的很清楚
    http://dev.mysql.com/doc/refman/4.1/en/set.html
  • edited 十二月 2006
    分成多種位較好?,還是用一個欄位包含多項呢?
    不好意思我的意思是,在選手的報名項目欄位中,應該用一個欄位包含多個比賽項目,還是用很多不同的欄位來,一個欄位代快一個比賽項目呢?
    還有到時用印秩序冊,希望能把相同的比賽項的選手抓出來,
    依各種不同的項目排出......

    謝謝~~
  • edited 十二月 2006
    我個人不建議用SET型態,因為這種型態並不是大多數資料庫系統所支援,可移植性會比較低。
    其實複選的問題,我個人建議用另外一張表來作關聯紀錄會比較好。
  • edited 十二月 2006
    資料庫方面,可以:
    1. 建立一對多關聯表格。
    example:

    create table "Players" (
    id int not null,
    name varchar(32),
    primary key (id)
    );

    create table "Games" (
    id int not null,
    name varchar(32),
    primary key (id)
    );

    create table "PlayerOfGame" (
    "playerId" int not null REFERENCES "Players" (id) ON DELETE CASCADE,
    "gameId" int not null REFERENCES "Games" (id) ON DELETE CASCADE
    );

    select "PlayerOfGame".*, "Players".name as "PlayerName", "Games".name as "GameName" from "Players"
    inner join ("PlayerOfGame"
    inner join "Games" on "PlayerOfGame"."playerId" = "Games".id
    ) on "PlayerOfGame"."playerId" = "Players".id

    上面語法 DB2, M$SQL, PostgreSQL 皆ok。
    在 PHP 中 query 的結果,還需要再自行整理一遍。
    $playerOfGames = array();
    $gameWithPlayers = array();
    while($row = $stmt->fetch()) :
    if (!isset($playerOfGAmes[$row])) :
    $playerOfGAmes[$row] = array();
    endif;
    array_push($playerOfGAmes[$row], $row);

    if (!isset($gameWithPlayers[$row])) :
    $gameWithPlayers[$row] = array();
    endif;
    array_push($gameWithPlayers[$row], $row);
    endwhile;

    2. 用 XML 欄位。 XML type 欄位是 SQL 2003 標準規範資料型態, Oracle, IBM DB2 v9, M$ SQL Server 2005, PostgreSQL 8 皆支援。我不用 mysql ,不知道 mysql 支援了沒。


    3.不要在一個選手記錄建立多個比賽欄位,像 game1, game2, game3 這種就不對了。一來非常浪費空間;二來限定了項目數上限,如果我只定義到 game3 ,那麼一個選手最多只能參加3個項目。
    當然,如果你們的程式需求限定每位選手至少參加一個,最多參加2~3個,那麼用這種方法也無妨。
  • edited 一月 2007
    這裡有 shirock 進一步的說明:
    http://blog.roodo.com/rocksaying/archives/2606029.html

    這兒不會介意貼上自己部落格的相關文章,也希望 shirock 不會介意我將網址附註到討論中 :)
  • edited 一月 2007
    謝謝 kiang 幫我加註,辛苦了。知識要分享才有用,我不介意這種事。
Sign In or Register to comment.