3

mysql に 5 つのテーブルがあり、4 つの 1 対多の関係を形成しています。テーブルは、last_name、parent、child、grandchild、および city です。姓には親が多く、親には子が多く、子には孫が多く、市には孫が多い。

(特定の都市の) 孫をランダムな順序で取得する必要がありますが、last_name (つまり、異なる行ではあるが連続して) でグループ化されていますが、last_name はランダムな順序です。だから基本的に。

Last_name     GrandChild
    B            3
    B            56
    B            9
    D            2
    D            67
    C            38
    C            20
    A            14

私はこれまでのところこれを持っています

 SELECT ln.id, gc.id
        FROM parent p
        INNER JOIN child ch
        ON ch.parent_id = p.id
        INNER JOIN grandchild gc
        ON ch.id = gc.child_id
        WHERE gc.city_id = 3

これで必要なレイアウトと関係が得られましたが、そこからどこに行けばよいかわかりません。これは可能ですか?もしそうなら、どのコマンド/テクニックを調べる必要がありますか?

4

2 に答える 2

3

「グループ化」とは、各孫を別々の行に配置することを意味しますが、すべての孫が連続する行に同じ名前で表示されることを意味します。

    SELECT ln.id, gc.id
    FROM parent p INNER JOIN
         child ch
         ON ch.parent_id = p.id INNER JOIN
         grandchild gc
         ON ch.id = gc.child_id inner join
         (select ln.*, rand() as rand
          from lastname ln
         ) ln
         on p.lastname = ln.lastname
    WHERE gc.city_id = 3
    order by ln.rand

つまり、これは姓に乱数を割り当て、それをbyによる順序付けに使用します。ちなみに、あなたのリクエストはあいまいです。姓ではなく親で並べ替える場合は、親に対してサブクエリを実行します。

于 2012-12-02T00:06:04.330 に答える
0
    SELECT gc.lastname, group_concat(p.lastname) as grandchildren
    FROM parent p
    INNER JOIN child ch ON ch.parent_id = p.id
    INNER JOIN grandchild gc ON ch.id = gc.child_id
    WHERE gc.city_id = 3
    group by gc.lastname
于 2012-12-01T23:51:37.733 に答える