2011-06-20 80 views
0

我的字典數據庫與4桌設計成類似MySQL的左連接重複行

words 
wordid | lemma 

senses 
wordid | synsetid 

synsets 
synsetid | definition 

samples 
synsetid | sample 

所以我使用查詢下面讓所有感覺的定義在工作和樣品

if(isset($searchterm)){ 

      echo "<b>".$searchterm."</b><hr>"; 

      // QUERY TO FIND SENSES 
      $senses_query="SELECT 
       words.lemma,words.wordid, 
       senses.wordid,senses.synsetid, 
       synsets.synsetid, synsets.definition, 
       samples.synsetid, samples.sample 
      FROM 
       words 
      LEFT JOIN 
       senses ON words.wordid=senses.wordid 
      LEFT JOIN 
       synsets ON senses.synsetid=synsets.synsetid 
      LEFT JOIN 
       samples ON senses.synsetid=samples.synsetid 
      WHERE 
       words.lemma REGEXP '^$searchterm$'"; 

      $senses_query_result = mysql_query($senses_query) OR die("sense alamadım.<br>".mysql_error()); 
      $num=mysql_num_rows($senses_query_result); 


      while($sensesFound = mysql_fetch_array($senses_query_result)){ 

       echo "&nbsp; "  . $sensesFound['lemma'] . ""; 
       echo "&nbsp; "  . $sensesFound['definition'] . ""; 
       echo "&nbsp; "  . $sensesFound['sample'] .  ""; 
       echo "<br>"; 

      } 

    } 

的問題是:如果有一個以上的定義樣本,它會像這樣重複。

definition 1 sample 1 
definition 1 sample 2 
definition 2 sample 1 
definition 2 sample 2 
definition 2 sample 3 
e.t.c 

我喜歡像

definition 1 sample 1 sample 2 
definition 2 sample 1 sample 2 sample 2 

我試着選擇GROUP_CONCAT行,但它concats所有定義的所有樣品爲單一。

是否有可能與MySQL查詢或我應該使用PHP來處理這種工作。

在此先感謝

+0

爲什麼要使用正則表達式,而不是'LIKE'? –

回答

0

你想所有樣品(一行)每個定義

因此,使用GROUP_CONCAT(samples.sample)GROUP BY senses.wordid, senses.synsetid

(我猜senses.wordid, senses.synsetid是表的主鍵senses

 $senses_query=" 

     SELECT 
      words.lemma, words.wordid, 
      senses.wordid, senses.synsetid, 
      synsets.synsetid, synsets.definition, 
      COUNT(samples.synsetid) AS numberOfSamples 
      GROUP_CONCAT(samples.sample SEPARATOR ', ') AS samples 
     FROM 
      words 
     LEFT JOIN 
      senses ON words.wordid=senses.wordid 
     LEFT JOIN 
      synsets ON senses.synsetid=synsets.synsetid 
     LEFT JOIN 
      samples ON senses.synsetid=samples.synsetid 
     WHERE 
      words.lemma REGEXP '^$searchterm$' 

     GROUP BY senses.wordid, senses.synsetid 
     "; 
+0

@ypercupe @Dan @Rakesh我感謝大家。使用爆炸有助於實現我想要的結果。 – mustafa

1

您可以使用GROUP_CONCAT,然後在該列PHP中使用explode分裂的個體樣本。

此外,使用GROUP_CONCAT時,請務必使用未在示例文本中使用的分隔符。

+0

GROUP_CONCAT的問題是:當我使用SELECT GROUP_CONCAT(samples.sample SEPERATOR'')時,它會將樣本(所有定義)連接成一個字符串。但我想CONCAT definiton 1的樣本合成爲一個字符串,definiton 2的樣本合併到另一個字符串中,等等......但不僅僅是使用CONCAT,我希望瞭解是否可以編寫單個查詢 - 沒有CONCAT - 會給我想要的結果 – mustafa

0

不,您無法從單個查詢中獲得所需的方式,您必須使用GROUP_CONCAT以單行形式提取所有行(在連接查詢中重複)。

使用GROUP_CONCAT,分開,就像@丹說的,你可以用explode (",", $result)來得到它的數組。

對於前:

SELECT GROUP_CONCAT(samples.sample SEPERATOR ',') ..... 

上面的查詢將給出的結果就像

definition 1 sample-1,sample-2 
definition 2 sample-1,sample-2,sample-3 
.....