1

託児所の保護者の連絡先リストを作成しました。今、私はそれをウェブページに表示したいと考えています。これまでのところ、技術的には完璧に動作しますが、満足できないのはレイアウトです。

私のデータベースのしくみについて簡単に説明します。各親は 1 人以上の子を持つことができ、各子は 1 人以上の親を持つことができます - 多対多の関係です。1 対多の関係を作成するために、parent、children、parent_children の 3 つのテーブルに分割しました。次に、JOIN を使用すると、すべてがうまく表示されます。ただし、すべてのエンティティを表示するため、Web ページに表示するにはかなり雑然とします。例を挙げて説明します:

家族 1: マークとアリスのウィルソンには、ジョンとビルの 2 人の子供がいます。
家族 2: Peter と Jessica Robertson には、1 人の子供、Lisa がいます。

Current layout:
Parent                Child
-------------------------------
Mark Wilson           John Wilson
Mark Wilson           Bill Wilson
Alice Wilson          John Wilson
Alice Wilson          Bill Wilson

Peter Robertson       Lisa Robertson
Jessica Robertson     Lisa Robertson
-------------------------------

Desired layout:
Parent                Child
-------------------------------
Mark Wilson           John Wilson
Alice Wilson          Bill Wilson

Peter Robertson       Lisa Robertson
Jessica Robertson
-------------------------------

希望のレイアウトを取得する良い方法はありますか?


わかりましたので、GROUP_CONCAT の使用方法に応じて、これを 1 つの列で機能させることができました。

コード:

SELECT GROUP_CONCAT(parents.name) AS Parents, children.name
FROM parents p
LEFT JOIN parents_children pc USING(id_parent)
LEFT JOIN children c USING(id_child)
GROUP BY pc.id_parent;

結果:

Parents                             Children
-----------------------------------------------
Mark Wilson, Alice Wilson           Bill Wilson
Mark Wilson, Alice Wilson           John Wilson
Peter Robertson, Jessica Robertson  Lisa Robertson

同様に、代わりに GROUP_CONCAT children.name と GROUP BY pc.id_child を使用すると、次のようになります。

Parents                Children
------------------------------------------
Mark Wilson            Bill Wilson, John Wilson
Alice Wilson           Bill Wilson, John Wilson
Peter Robertson        Lisa Robertson
Jessica Robertson      Lisa Robertson

これらの組み合わせが本当に必要で、次の結果が得られます。

Parents                                Children
----------------------------------------------------
Mark Wilson, Alice Wilson              Bill Wilson, John Wilson
Peter Robertson, Jessica Robertson     Lisa Robertson
4

4 に答える 4

2

SELECT DISTINCT は、親テーブル内の各エンティティの 1 つのインスタンスに制限する必要があります。

于 2012-05-16T18:55:28.673 に答える
1

テーブルの親:

CREATE TABLE `parents` (

id_partint(11)NOT NULL AUTO_INCREMENT、 parentvarchar(60)DEFAULT NULL、PRIMARY KEY(id_part))ENGINE = InnoDB AUTO_INCREMENT = 7 DEFAULT CHARSET = utf8

テーブルの子:

CREATE TABLE `child` (

id_childint(11)NOT NULL AUTO_INCREMENT、 childvarchar(60)DEFAULT NULL、 f_nameint(11)DEFAULT NULL、 m_nameint(11)DEFAULT NULL、PRIMARY KEY(id_child)、KEY m_keym_name)、KEY f_keyf_name)、CONSTRAINT f_keyFOREIGN KEY(f_name)REFERENCES parentsid_part) ON DELETE CASCADE ON UPDATE CASCADE、CONSTRAINT m_keyFOREIGN KEY(m_name)REFERENCES parentsid_part)ON DELETE CASCADE ON UPDATE CASCADE)ENGINE = InnoDB AUTO_INCREMENT = 8 DEFAULT CHARSET = utf8

2つのテーブルを結合するためのクエリ

SELECT DISTINCT

GROUP_concat(child.child)、p1.parent、p2.parentFROMchild内部結合親ASp1ON p1.id_part=child.f_name内部結合親ASp2ON p2.id_part = child.m_name GROUP BY p1.parent、p2。親

結果

子供の名前| 父の名前| 母親の名前

x、y、z | 父1| 母1

q、r | 父2| マザー2

t、j | 父3| マザー3

于 2012-05-19T00:15:07.060 に答える
1
SELECT
    Parents
  , GROUP_CONCAT(name ORDER BY name) AS Children
FROM
  ( SELECT 
        GROUP_CONCAT(p.id_parent ORDER BY p.name) AS parents_ids
      , GROUP_CONCAT(p.name ORDER BY p.name) AS Parents
      , pc.id_child
      , c.name
    FROM parents p 
      JOIN parents_children pc USING(id_parent)
      JOIN children c USING(id_child)
    GROUP BY pc.id_child
  ) AS tmp 
GROUP BY parents_ids ;

次の場所でテストできます: SQL-Fiddle

于 2012-05-18T23:31:47.373 に答える
0

この問題には 2 つの解決策があります。

  1. PHP側では、配列を繰り返し処理し、キーのキーに
    [$parent_1 . '|' . $parent2]子を持つ別の配列が含まれる配列を作成します。

  2. SQL の最後に、次のようなことを行います。

    SELECT 
        GROUP_CONCAT(Parents.name ORDER BY Parents.parents_id, '|') AS parents, 
        Children.name as child
    FROM Children 
        LEFT JOIN CildrentParents USING( children_id )
        LEFT JOIN Parents USING( parent_id )
    GROUP BY Childrent.children_id
    

    次に、このデータセットを操作します。

PS私にはわかりませんDISTINCT。元のクエリに追加するだけでこれが解決するのでしょうか...ここで何かが足りないのかもしれません。

アップデート

PHP を使用して、各parentキーに子のリストが含まれる配列を作成するのを妨げているのは、正確には何ですか?

于 2012-05-16T19:03:50.837 に答える