2009-08-01 9 views
0

私は以下の作業を行う最良の方法が必要です。可能であれば、出力のための変数を与えるためにすべての方法を取るので、何が起こっているかをよく見て、あなたが私よりも賢く思う多くの時間を見ます。3テーブルmysqlクエリを正しく定式化するには

表1は、ユーザー情報、名字、電子メールなどを保持します。表1の1次auto_incrementキーはidです。 表2は、一連の名字と姓を保持し、そのキーはxidであり、表1のid(所有者リストのみを表示するために使用)はuidです。 表3は、表2のユーザーのリストの設定データを保持しています。ユーザーごとにリストごとに複数の設定を持つことができるので、表2にそれを組み込むのは賢明ではありませんでした。したがって、表3にはcxid(xidの表2キー、 forのリスト)、次にuidを使用して、どのテーブル1のユーザーがその設定にアクセスできるかをマークします。 auto_incrementキーはcidと呼ばれます。

行ごとに、それはcxidを抽出し、uidが、その後については表2に照会するようにだから私がする必要がどのような

Table 1(user) - Primary key = id 
Table 2(list) - Primary key = xid, and user field is uid. 
Table 3(config) - Primary key = cid, list field is cxid, and user field is uid. 

をそれを打破するために、表3にmysqlのクエリを策定されます特定のリストリストを見つけたら、表2の行からすべてのデータを抽出して、そのデータで関数を実行できるようにする必要があります。

私はこれを最も効率的な方法で書くことをどこで始めるべきか正確にはわかりません。これを行う簡単な方法がいくつかあります。当面は、上記の値は、単にURLに渡されているが、私はセッションにそれを変更しようが、ちょうどIVEはそう

$variable = $_GET['variable']; 

として、各変数を定義していること、クエリも開始する前にいることを前提としています変数は、私は一貫性のある主キーの名前と、より良い外部キー名を使用することができ促すだろう...これは、あなたが欲しいものを行う必要があります$ cxid、$ XID

+0

は基本的に、これは実行し、すべての設定行を通過しますcronジョブ、になるだろうされ、表3の設定データを使用して表2のリストの機能を実行します。 – mrpatg

+0

これら4つの変数のすべてをスクリプトに渡していますか? –

答えて

1

SELECT * 
FROM user AS [u] 
JOIN list AS [l] 
    ON l.uid = u.id 
JOIN config AS [c] 
    ON c.uid = u.id 
    AND c.cxid = l.xid 
WHERE u.id = $id 
AND l.xid = $xid 
AND c.cxid = $cxid 

$ ID、$のUIDです保守性と予測性を向上させます。

CREATE TABLE user 
(
id INT NOT NULL 
,CONSTRAINT pk_userId PRIMARY KEY (id) 
) 


CREATE TABLE list 
(
id INT NOT NULL 
,userId INT NOT NULL 
,CONSTRAINT pk_listId PRIMARY KEY (id) 
,CONSTRAINT fk_userList FOREIGN KEY (userId) REFERENCES user(id) 
) 


CREATE TABLE config 
(
id INT NOT NULL 
,userId INT NOT NULL 
,listId INT NOT NULL 
,CONSTRAINT pk_configId PRIMARY KEY (id) 
,CONSTRAINT fk_userConfig FOREIGN KEY (userId) REFERENCES user(id) 
,CONSTRAINT fk_listConfig FOREIGN KEY (listId) REFERENCES list(id) 
) 
0

あなたはそれを説明してきた方法から、テーブルの関係があるように、それはそうです:

  • 1のユーザは、多くのconfigs

た場合に多くのリスト

  • つのリストを持っています私は問題を正しく理解していて、各設定エントリを調べ、その設定のリストを取得したいと思っています。

    • ユーザー(ID)
    • 一覧(XID、UID)
    • コンフィグ(CID、cxid、UID)

    私はあなたの用語を使用する場合は、スキーマは次のようになります

    ここで、id = uid、およびxid = cxidです。

    また、取得する情報は、Configの各レコードについて、すべてのデータとそのレコードに対応するすべてのリストデータです(ユーザーデータも必要ですか?)

    使用すると、1つのSQLですべてのデータを取り出すことができるようにこれは、まっすぐ進むの関係のようになります。このクエリは、リストのすべてのデータを含む、コンフィグテーブルにあなたのすべてのレコードを取得します

    select c.*, l.*, u.* 
    from Config c 
    join List l 
    on c.cxid = l.xid 
    join User u 
    on u.id = l.uid 
    

    その設定を所有し、そのリストを所有するユーザーのすべてのデータも格納します。

    使用すると、1つの特定のconfigエントリのデータを取得したい場合は、あなたのような読み取りにSQLを追加可能性がある(つまり、この関係の最も深い主キーであるとして、あなただけ、$のCID値を必要とすることに注意してください):

    select c.*, l.*, u.* 
    from Config c 
    join List l 
    on c.cxid = l.xid 
    join User u 
    on u.id = l.uid 
    where c.cid = $cid 
    

    ので、PHPの用語では、あなたがそのようにアプローチする場合がありますが起こっていただきました

    // here is the sql query 
    $query = "select c.*, l.*, u.* from Config c join List l on c.cxid = l.xid join User u on u.id = l.uid"; 
    
    // here are the results from MySQL 
    $result = mysql_query($query); 
    
    // and now for each result, throw it into an array called $row 
    while($row = mysql_fetch_assoc($result)) 
    { 
        // get some data from that row, for example, Config.`data`, List.`functionname`, and User.`FirstName` 
        $config_data = $row['data']; 
        $function_name = $row['functionname']; 
        $first_name = $row['FirstName']; 
    
        // now do whatever you'd like with this data, before looping to the next record... 
        some_function($config_data, $function_name, $first_name); 
    } 
    
  • +0

    あなたはあなたの返信には正しいですが、私は(テーブル名に合わせて)あなたのクエリを試してみましたが、エラーはスローされませんでしたが、結果は返されません。 – mrpatg

    +0

    このクエリをデータベース上でまっすぐに実行しているのですか、またはPHP環境の$ cidなどの変数を使用していますか?そうであれば、その値はどのようになっていますか? また、データ結合問題かどうかを確認するために、 'join'ステートメントを 'left join'に置き換えようとしています...もし左結合の結果が得られれば、間違ったテーブルの関連付けが行われているはずです。 –

    関連する問題