2011-06-20 6 views
0

Je travaille sur une base de données de dictionnaire avec 4 tables conçu commemysql jointure gauche répéter les lignes

words 
wordid | lemma 

senses 
wordid | synsetid 

synsets 
synsetid | definition 

samples 
synsetid | sample 

J'utiliser une question ci-dessous pour obtenir toutes les définitions et les échantillons

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>"; 

      } 

    } 

sens Le problème est : s'il y a plus d'un échantillon d'une définition, il répète comme ceci.

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

J'aime avoir des lignes comme

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

J'ai essayé group_concat sur select mais il concats tous les échantillons de toutes les définitions en simple.

Est-ce possible avec mysql query ou dois-je utiliser php pour gérer ce genre de travail.

Merci à l'avance

+0

Pourquoi utilisez-vous des expressions régulières et non 'LIKE'? –

Répondre

0

Vous voulez tous les échantillons (dans une ligne) pour toutes les définitions.

Par conséquent, utilisez GROUP_CONCAT(samples.sample) et aussi GROUP BY senses.wordid, senses.synsetid:

(Je suppose que senses.wordid, senses.synsetid est la clé primaire de la table 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 Je vous remercie tous. L'utilisation d'exploser m'a aidé à atteindre le résultat que je voulais. – mustafa

1

Vous pouvez utiliser GROUP_CONCAT puis en php utilisation explode sur la colonne pour séparer les échantillons individuels.

De même, avec GROUP_CONCAT, assurez-vous d'utiliser un délimiteur non utilisé dans le texte d'exemple.

+0

Le problème avec GROUP_CONCAT est: Quand je l'utilise SELECT GROUP_CONCAT (samples.sample SEPERATOR '') il encapsule des échantillons (de toutes les définitions) dans une chaîne. Mais je veux CONCAT sampels de definiton 1 dans une chaine, des samples de definiton 2 dans une autre chaine et ainsi de suite ... Mais plus que j'utilise CONCAT j'aime apprendre s'il est possible d'écrire une seule requête - sans CONCAT - ça va donne les résultats que je veux – mustafa

0

Non, vous ne pouvez pas obtenir ce que vous voulez d'une seule requête, vous devez utiliser GROUP_CONCAT pour récupérer toutes les lignes (répétition dans la requête de jointure) comme une seule ligne.

Utilisez GROUP_CONCAT séparés par , et comme @Dan dit, vous pouvez explode (",", $result) pour l'obtenir dans un tableau.

Ex:

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

La requête ci-dessus donnera les résultats comme

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