2015-12-04 95 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));