MySQL левого соединения повторяющихся строк - PullRequest
0 голосов
/ 20 июня 2011

Я работаю над базой данных словаря с 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

Я пытался использовать group_concat для select, но он объединяет все выборки всех определений в один.

Возможно ли это с помощью запроса MySQL или я должен использовать php для выполнения такого рода работы.

Заранее спасибо

Ответы [ 3 ]

1 голос
/ 20 июня 2011

Вы можете использовать GROUP_CONCAT, а затем в php использовать взорвать в столбце, чтобы разделить отдельные образцы.

Кроме того, с GROUP_CONCAT убедитесь, что вы используете разделитель, который не используется в тексте образца.

0 голосов
/ 21 июня 2011

Вы хотите все образцы (в один ряд) для каждое определение .

Поэтому используйте 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 голосов
/ 21 июня 2011

Нет, вы не можете получить нужный путь из одного запроса, вы должны использовать 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
.....
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...