2015-12-04 98 views
1

我在我的MySQL DB中有三个表:学校,家长和学生。学生有两列“school_id”和“parent_id”,它们将学生的每一行链接到父母的单行和学校的单行。结构是这样的,父母可以在一些学校中有孩子,但该父母只能有一个记录。现在我想从父母中选择行,这样无论学生有多少行指向该父母,只有一行被拉下。目前我的查询是这样的:从MySQL表中选择不重复

$stmt = $db->prepare("SELECT p.* 
         FROM parents p 
          INNER JOIN studnts S ON p.id = s.parent_id 
         WHERE s.school_id = :schoolID"); 

$stmt->execute(array(':schoolID'=> $schoolID)); 

我甚至有LEFT OUTER JOIN取代INNER JOIN。不用找了。

这个查询是从学生的每一行中拉出父母的一行。任何帮助?

谢谢。

+0

请出示你的数据库模式? –

+1

查看'DISTINCT' –

+0

@ piet.t非常感谢。解决了这个问题。 –

回答

1
SELECT 
      p.* 
    FROM 
      parents p INNER JOIN studnts S ON p.id = s.parent_id 
    WHERE 
      s.school_id = :schoolID 
    GROUP BY 
      p.parent_id 

    or 

    SELECT 
      DISTINCt p.parent_id, p.parent_name, p.parent_address ....etc 
    FROM 
      parents p INNER JOIN studnts S ON p.id = s.parent_id 
    WHERE 
      s.school_id = :schoolID 

更多地了解GROUP BY

http://dev.mysql.com/doc/refman/5.7/en/group-by-functions.html

更多地了解DISTINCT

http://dev.mysql.com/doc/refman/5.7/en/distinct-optimization.html

如果你想同时学生(S)的名称,与父母 沿使用GROUP_CONCAT

了解更多关于在查询中使用不同的GROUP_CONCAT

https://www.percona.com/blog/2013/10/22/the-power-of-mysqls-group_concat/

+2

'DISTINCT'不是一个函数(在列上),它是“SELECT DISTINCT”的一部分,适用于整个选定的行。例如。 'SELECT DISTINCt(p.parent_id),p.parent_name'与'SELECT DISTINCt p.parent_id,p.parent_name'相同,它与'SELECT DISTINCt(p.parent_id,(p.parent_name)'相同。小费就是跳过那些不必要的括号,这样就不会让人感到困惑。 – jarlh

+0

@jarlh!对,同意! – Hytool

2

只需将帮助

$stmt = $db->prepare("SELECT distinct p.* 
         FROM parents p 
          INNER JOIN studnts S ON p.id = s.parent_id 
         WHERE s.school_id = :schoolID"); 

$stmt->execute(array(':schoolID'=> $schoolID));