3

クエリの提案が必要です。

以下のようなテーブル スキーマを持つ 3 つのテーブルがあります。

clause_type:
-------------
clause_type_id  clause_type_title
--------------  ------------
1               clause type 1
2               clause type 2


clause:
-------
clause_id   clause_type_id      clause_title        position_no
---------   ------------        ------------        -----------
1           1                   clause 1            1
2           1                   clause 2            2
3           2                   clause 3            1


clause_type_link_clause:
-----------------------
clause_id   clause_type_id      position_no
---------   ------------        ------------
3           1                   3

"clause" テーブル列の "clause_id" は自動インクリメント列です。句は 1:N の clause_types を持つことができます。したがって、この 1:n の関係を維持するために、3 番目のテーブル "clause_type_link_clause" があります。ご覧のとおり、「条項 1 & 2」とともに、「条項 3」も「条項タイプ 1」にリンクされています。すべての「原因」が特定の「clause_type」に属するようにクエリを作成する必要があります。

Expected result:

clause_id   clause_type_id      clause_title        position_no
---------   ------------        ------------        -----------
1           1                   clause 1            1
2           1                   clause 2            2
3           1                   clause 3            3
3           2                   clause 3            1

ある種の JOINS を試しましたが、成功しませんでした。

SELECT 
  clause_type.`clause_type_id`,
  clause.`clause_id` 
FROM
  `clause` AS clause,
  `clause_type` AS clause_type 
  LEFT JOIN `clause_type_link_clause` AS clause_type_link_clause 
    ON (
      clause_type_link_clause.`clause_type_id` = clause_type.`clause_type_id`
    ) 
WHERE clause_type.`clause_type_id` = clause.`clause_type_id`

助けてください。

4

2 に答える 2

1

私は個人的にあなたのテーブルからcaluse_type_idと を削除し、これらの soley を に保存します。これにより、同様の情報が 2 つの異なる場所に保存されるのを回避できます。position_noclauseclause_type_link_clause

この変換を行うには、次を使用できます。

INSERT INTO clause_type_link_clause (Clause_ID, Clause_Type_ID, Position_No)
SELECT  Clause_ID, Clause_Type_ID, Position_No
FROM    Clause
WHERE   NOT EXISTS
        (   SELECT  1
            FROM    clause_type_link_clause
            WHERE   clause_type_link_clause.Clause_ID = Clause.Clause_ID
            AND     clause_type_link_clause.Clause_Type_ID = Clause.Clause_Type_ID
            AND     clause_type_link_clause.Position_No = Clause.Position_No
        );

ALTER TABLE Clause DROP COLUMN Clause_Type_ID;
ALTER TABLE Clause DROP COLUMN Position_No;

これにより、スキーマは次のようになります。

clause:
-------
clause_id   clause_title 
---------   ------------ 
1           clause 1     
2           clause 2      
3           clause 3     


clause_type_link_clause:
-----------------------
clause_id   clause_type_id      position_no
---------   ------------        ------------
1           1                   3
2           1                   2
3           2                   1
3           1                   3

したがって、目的の出力を取得するには、クエリは次のようになります

SELECT  Clause.Clause_ID,
        clause_type_link_clause.Clause_Type_ID,
        Clause.Clause_Title,
        clause_type_link_clause.Position_No,
        Clause_Type.clause_type_title
FROM    Clause
        INNER JOIN clause_type_link_clause
            ON clause_type_link_clause.Clause_ID = Clause.Clause_ID
        INNER JOIN Clause_Type
            ON Clause_Type.Clause_Type_ID = clause_type_link_clause.Clause_Type_ID
ORDER BY Clause.Clause_ID, clause_type_link_clause.Clause_Type_ID;

SQL Fiddle の例

ただし、次のようにスキーマを変更しなくてもこれを実現できます。

SELECT  Clause.Clause_ID,
        ctlc.Clause_Type_ID,
        Clause.Clause_Title,
        ctlc.Position_No,
        Clause_Type.clause_type_title
FROM    Clause
        INNER JOIN 
        (   SELECT  Clause_ID, Clause_Type_ID, Position_No
            FROM    clause_type_link_clause
            UNION
            SELECT  Clause_ID, Clause_Type_ID, Position_No
            FROM    Clause
        ) ctlc
            ON ctlc.Clause_ID = Clause.Clause_ID
        INNER JOIN Clause_Type
            ON Clause_Type.Clause_Type_ID = ctlc.Clause_Type_ID
ORDER BY Clause.Clause_ID, ctlc.Clause_Type_ID;

SQL Fiddle の例

于 2013-05-23T07:51:04.080 に答える