Ik ben bezig een messaging systeem te maken voor een soort van webshop. De bedoeling is dat er een verkoper is die zijn product online te koop zet. Dan is er een mogelijke koper die een motivatie moet achterlaten aan de verkoper. Die verkoper zal dan op zijn beurt daarop reacties geven. Er kunnen dus meerdere motivatieberichten zijn van mogelijke kopers waarop de verkoper dan kan reageren.
Nu heb ik een probleem met mijn query en bijhorende output. Zie hieronder.

Tabellen in db:

Tabel users:

    id  firstname        lastname        company
    1   user1_firstname  user1_lastname  company_user1
    2   user2_firstname  user2_lastname  company_user2


Tabel messages

    id  userid  motivation                     article_id  date_created
    1   1       Motivation text from buyer 1       1       date_created1
    2   1       Motivation text from buyer 1       1       date_created2
    3   2       Motivation text from buyer 2       1       date_created3


Tabel articles

    id  userid  title                explaination                 date_created
    1   3       Title for article 1  explaination for article 1   date_created1
    2   3       Title for article 2  explaination for article 2   date_created2


Tabel messages_sellers

    id  userid_buyers  message_id  reaction                         article_id  date_created
    1   1              1           Reaction from seller to buyer 1      1        date_created1
    2   2              2           Reaction from seller to buyer 2      2


Totale code voor de output:

<?php
		  $article_id = $_GET['article_id'];
		  
		  $sql = "
		  SELECT 
			 u.firstname, 
			 u.lastname, 
			 u.company, 
			 m.motivation,
			 ms.reaction,
			 m.userid as message_id_buyer,
			 a.id as article_idx,
			 a.explaination,
			 a.date_created as datecreated_seller,
			 m.id as message_id,
		     group_concat(CONCAT(m.motivation, '&&', m.date_created) SEPARATOR '----') as motivations,
		     group_concat(CONCAT(ms.reaction, '&&', ms.date_created) SEPARATOR '----') as reactions
	      FROM 
		     messages m 
		  LEFT JOIN 
		     articles a 
		  ON 
		     a.id = m.article_id
		  LEFT JOIN 
		     users u 
		  ON 
		     a.userid = u.id 
	      LEFT JOIN
		     messages_sellers ms
		  ON
		     ms.message_id = m.id
	      WHERE 
		     m.article_id = '$article_id'
		  GROUP BY
		     a.id
	      ORDER BY
		     m.date_created desc
		  ";
		  
		  $res = mysql_query($sql) or die (mysql_error());
		  $num_rows = mysql_num_rows($res);
		  
		  if($num_rows > 0) {
	      
		  while($row = mysql_fetch_assoc($res)) {
	   ?>    
            
                  <?php //Explaination from seller for article ?>
                       <article class="review-box clearfix">
                          <div class="rev-content" style="margin-left: -90px !important;">
                             <h3 style="text-transform: none !important;"><?php echo $row['firstname']; ?> <?php echo $row['lastname']; ?> (<?php echo $row['company']; ?>) | <?php echo date('d-m-Y H:i', strtotime($row['datecreated_seller'])); ?></h3>
                             <div class="rev-text">
                                <p><?php echo $row['explaination']; ?></p>
                                <a href="?article_id=<?php echo $row['article_idx']; ?>&userid_buyer=<?php echo $row['message_id_buyer']; ?>#add-review" class="theme-button marT10">Post your reaction</a>
                             </div>
                          </div>
                       </article>
                       
                       
                    <?php 
                    $motivations = $row['motivations'];
                    $motivations_array = explode('----',$motivations);

				    if(is_array($motivations_array) && count($motivations_array) > 0 ){
						
						foreach($motivations_array as $motivation_name){ 
							$arr = explode('&&',$motivation_name);
							
							if(!empty($arr[1])){
					?>    
                       
                       <!-- posting motivations -->
                       <article class="review-box clearfix" style="margin-bottom: -5px !important;">
                          <div class="rev-content">
                             <h3 style="text-transform: none !important;">Uw antwoord verstuurd op <?php echo date('d-m-Y H:i', strtotime($arr[1])); ?></h3>
                             <div class="rev-text">
                                <p><?php echo $arr[0]; ?></p>
                             </div>
                          </div>
                       </article>
                    
					<?php } } } ?>
                     
                     
                     
                     
                    <?php 
                    $reactions = $row['reactions'];
                    $reactions_array = explode('----',$reactions);

				    if(is_array($reactions_array) && count($reactions_array) > 0 ){
						
						foreach($reactions_array as $reaction_name){ 
							$arr2 = explode('&&',$reaction_name);
							
							if(!empty($arr2[1])){
					?>    
                       
                       <!-- Posting reactions on motivations -->
                       <article class="review-box clearfix" style="margin-left: -90px !important;">
                          <div class="rev-content">
                             <h3 style="text-transform: none !important;">Uw reactie verstuurd op <?php echo date('d-m-Y H:i', strtotime($arr2[1])); ?></h3>
                             <div class="rev-text">
                                <p><?php echo $arr2[0]; ?></p>
                             </div>
                          </div>
                       </article>
                    
					<?php } } } ?>


Het resultaat hiervan is:

    Explaination for article seller 1
       motivation message buyer 1 for article seller 1
       motivation message buyer 1 for article seller 1
       reaction back from buyer 1
    reaction seller 1


Maar wat ik uiteindelijk wil bereiken is:

    Explaination for article seller 1
       motivation message buyer 1 for article seller 1
       motivation message buyer 1 for article seller 1
    Reaction seller 1
       reaction back from buyer 1


Iemand die mij hiermee kan helpen?
Uhm, ik zou dan eerder zoiets verwachten?
Omschrijving bij geplaatst artikel 1
-----
Motivatie 1 op geplaatst artikel 2
    Antwoord 1 op motivatie 1
        Reactie 1 terug op antwoord 1
    Antwoord 2 op motivatie 1 (*1)
Motivatie 2 op geplaatst artikel 2
    Antwoord 1 op motivatie 2


Zodat het wat meer een boomstructuur volgt en reacties direct volgen na de berichten. Is het trouwens de bedoeling dat alle geïnteresseerden elkaars reacties zien?

Overigens: bij (*1) zou de productverkoper ook kunnen volstaan met het aanpassen van zijn laatste reactie, dan wordt het misschien wat minder rommelig.

Een ding wat je trouwens nog nodig hebt is een manier om na te gaan in welke volgorde je reacties afdrukt. Je zou kunnen volstaan met het bijhouden van een datum+tijd van plaatsing.
Ok, ik kan een date_created toevoegen aan mijn messages tabel met een CURRENT_TIMESTAMP.
Aanpassen van reacties van de productverkoper zou ik niet doen. Het is een soort van over en weer met berichten. Dus je geposte voorbeeld lijkt me ok. Alleen is het wel zo dat er meerdere berichten kunnen zijn van verkopers en kopers achter elkaar. Dus:

Omschrijving bij geplaatst artikel 1
------
Motivatie 1 op geplaatst artikel 2 door de koper
   Antwoord 1 op motivatie 1 door de verkoper
      Reactie 1 terug op antwoord 1 door de koper
      Reactie 2 terug op antwoord 1 (moet ook kunnen door de koper)
   Antwoord 2 op reactie 1 en 2 door de verkoper
   Antwoord 3 op reactie 1 en 2 door de verkoper (moet ook kunnen)
enz...


De verkoper ziet per geplaatst product zijn reacties (dat kan ik meesturen uit de eerder getoonde tabel met alle geplaatste producten. Daarnaast staan een knop die dan een GET meegeeft).
De kopers zien enkel hun eigen geplaatste conversaties met de verkopers en dus niet van elkaar per product. Ook terug via die overzichttabel en dan de knop die een GET zal meegeven in de URL.
Is mijn database structuur dan juist? Ook waar die vraagtekens staan?

[size=xsmall]Toevoeging op 22/12/2016 19:58:36:[/size]

Ik heb ondertussen een mysql InnoDb tabel gemaakt voor de nieuwe structuur messages.
Daarin heb ik een index gezet op message_id en dan een FOREIGN KEY op message_id naar id.
Denk dat dit correct is? Kan je mij even helpen hier met de query en de output ervan zoals in het voorbeeld?
De kopers zien enkel hun eigen geplaatste conversaties met de verkopers en dus niet van elkaar per product.

Dan hangt de informatie die je ophaalt af van het type gebruiker. En dan wordt het op voorhand ook wat lastiger om de juiste reacties van de verkoper te tonen bij de juiste koper, dit staat namelijk niet op voorhand vast maar hangt af van de persoon waar de verkoper op reageert. In dat opzicht is het misschien makkelijker om deze "threads" te splitsen in aparte conversaties tussen verkoper X en koper Y, en daar dan alles aan op te hangen?

Trouwens, de inhoud van bovenstaande quote bepaalt sterk de vorm van de oplossing. Daarom is het ook zaak dat er eerst een duidelijke (en volledige) specificatie is (nog) voordat je iets gaat bouwen.
Ik kan in de users tabel wel een extra veld zetten of ze koper of verkoper zijn? Iedereen die iets wil achterlaten van bericht moet toch ingelogged zijn. Dus dit is op te lossen. Ik heb een userid en een artikel_id die ik kan meesturen in een GET. Iedereen die is ingelogged krijg een cookie met user_id en type (verkoper of koper) dan.

Ik ben niet mee met je oplossing om deze te splitsen in aparte "threads"?
Nee, hiervoor is een andere login nodig. Iemand kan met zijn emailadres als koper/verkoper slechts 1 account aanmaken. Dus als iemand koper is geregistreerd kan die enkel inloggen als koper en als hij ook verkoper wil zijn moet hij een andere account aanmaken.
Login is emailadres die die moet mag maar 1 keer voorkomen in db per type account. Paswoord kan wel hetzelfde zijn.

Reageren