2012-12-01 156 views
3

我在mysql中有5个表格,形成4个一对多的关系。这些表格是姓氏,父母,子女,孙子和城市。姓氏有很多父母,父母有很多孩子,孩子有很多孙子,而城市有很多孙子。按随机顺序按组顺序

我需要以随机顺序得到孙子们(在某个城市),但是按姓氏分组(即,在不同的行上,但连续),但随机的顺序是姓氏。所以基本上。

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 

这只是给我的布局和关系,我需要,但我不知道从哪里里去。这可能吗?如果是这样,我需要查看哪些命令/技巧?

回答

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 

换句话说,这将一个随机数字分配给姓氏,然后将它用于order by。顺便说一句,您的要求是不明确的。如果你想按父母而不是姓氏排序,你可以在父母上进行子查询。

+0

不错。我认为OP需要:'通过ln.rand命令,RAND()' –

+0

Omg太棒了!不仅用于查询,还用于解释它的功能。我必须随机取得孙辈的名字,所以我只是用包裹姓氏的方式包好孙子。谢谢! – Helba

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