mysql左连接重复行

时间:2011-06-20 13:53:26

标签: mysql join

我正在开发一个字典数据库,其中有4个表格,如

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

我在select上尝试了group_concat,但它将所有定义的所有样本汇总为单个。

是否可以使用mysql查询或者我应该使用php来处理这种工作。

提前致谢

3 个答案:

答案 0 :(得分:1)

你可以使用GROUP_CONCAT,然后在php中使用列上的explode来分割各个样本。

此外,使用GROUP_CONCAT时,请确保使用示例文本中未使用的分隔符。

答案 1 :(得分:0)

不,您无法从单个查询中获得所需的方式,您必须使用GROUP_CONCAT将所有行(在连接查询中重复)作为单行获取。

使用GROUP_CONCAT分隔的,和@Dan说的一样,你可以explode (",", $result)将其添加到数组中。

例如:

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

上述查询将给出类似

的结果
definition 1 sample-1,sample-2
definition 2 sample-1,sample-2,sample-3
.....

答案 2 :(得分: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
        ";