Just nu i M3-nätverket
Gå till innehåll

Hämtar för många resultat från Query


danielv

Rekommendera Poster

Har byggt en query som ska plocka ut endast unika poster ur tabellen, men den plockar ut skräpvärden, som jag inte förstår varför:

 

 
'$current_user_id = inloggad användarid (tex md7dani = 1014)

$data_from_users = mysqli_query($GLOBALS["___mysqli_ston"], "SELECT DISTINCT LEAST(sender, recipient) AS person1, GREATEST(sender, recipient) AS person2 FROM ( 
   SELECT DISTINCT sender, recipient
   FROM inbox 
   WHERE sender = '$current_user_id' 

   UNION 

   SELECT DISTINCT sender, recipient
   FROM inbox 
   WHERE recipient = '$current_user_id' 
) u"); 


while ($row_search_result = mysqli_fetch_array($data_from_users)) { 


   $userid_users_least = $row_search_result['person1'];
   $userid_users_greatest = $row_search_result['person2'];


//Get rows for user from inbox
$userdata_from_inbox = mysqli_query($GLOBALS["___mysqli_ston"], "SELECT mail_id, sender, recipient, senddate, message FROM inbox WHERE (sender = '$userid_users_greatest' AND recipient = '$userid_users_least') OR (sender = '$userid_users_least' AND recipient = '$userid_users_greatest') ORDER BY senddate DESC");
$userdata_inbox = mysqli_fetch_array($userdata_from_inbox); 


<a href="<?php echo $_SERVER['PHP_SELF']?>"><?php echo $userdata_inbox['mail_id']; ?><?php echo $row_current_user_username['username']; ?>
         <div style="display:inline-block; vertical-align:top; margin-left:184px;">
<?php 	$message = substr($userdata_inbox['message'],0,40); // Get 20 first characters
    		$message = nl2br(htmlspecialchars($message)); // convert to html-text and make new-line to <br> tags in description.
    		$message = str_replace('&', '&', $message); // Make a real & sign.

    		echo $message."..."; ?>
 		</div>

         <div style="display:inline-block; vertical-align:top; float: right;"><?php echo $userdata_inbox['senddate']; ?></div></a>

<?php } //End While ?>


 

Ur tabellen;

 

mail_id sender recipient senddate subject message readmail Läsflaggaanswered Svarat-flaggasent_id Points to orig sent mail.

 

 

18,1014,1,2012-06-03 16:42:32NULLhdfgg dg dNoNoNULL

 

 

19,1014,2,2012-06-03 16:43:09NULLgfhf ghf hgf hfgh NoNoNULL

 

 

 

20,1014,2,2012-06-03 16:56:38NULLghj gjhhgjhgj jhghgj NoNoNULL

 

 

 

21,1015,1014,2012-06-17 18:25:18Hej!NoNo1

 

 

22,1015,1014,2012-06-17 18:36:55Hej!NoNo2

 

 

 

23,1015,1014,2012-06-17 18:37:55Hej!NoNo3

 

 

 

32,1014,2,2012-08-12 20:58:47NULLut u tutyu utty ytuNoNoNULL

 

 

33,1014,2,2012-08-13 20:16:31NULLdf fgg ggg ggssss ssssNoNoNULL

 

 

36,1018,1014,2012-10-02 22:25:19NULLd dg df dgfNoNoNULL

 

 

38,1018,1014,2012-10-04 19:35:14NULLghf ghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhNoNoNULL

Resultatet blir följande:

 

md7dani ghf ghhhhhhhhhhhhhhhhhhhhhhhhhhhhhh.. .2012-10-04 19:35:14

md7dani ghf ghhhhhhhhhhhhhhhhhhhhhhhhhhhhhh.. .2012-10-04 19:35:14

abel33 ... 2012-06-17 18:37:55

Daniel ghf ghhhhhhhhhhhhhhhhhhhhhhhhhhhhhh... 2012-10-04 19:35:14

Varför skrivs de 2 första raderna ut, md7dani x2??

Länk till kommentar
Dela på andra webbplatser

Har byggt en query som ska plocka ut endast unika poster ur tabellen, men den plockar ut skräpvärden, som jag inte förstår varför:

 

"SELECT DISTINCT LEAST(sender, recipient) AS person1, GREATEST(sender, recipient) AS person2 FROM (

SELECT DISTINCT sender, recipient

FROM inbox

WHERE sender = '$current_user_id'

 

UNION

 

SELECT DISTINCT sender, recipient

FROM inbox

WHERE recipient = '$current_user_id'

)

 

Hej!

 

Om vi analyserar din första sql-fråga så ser vi att den börjar med att bygga upp en vy som är en union av de rader i tabellen som antingen har användar-id som avsändare eller mottagare. Detta hade gått att lösa utan union (WHERE sender=$current_user_id OR recipient=$current_user_id).

Ur denna plockas sedan alla rader (dvs. du kan inte garantera att du bara får en rad), och det som visas som Person1 är det lägsta värdet av sender/recipient, och som Person2 det högsta värdet av sender/recipient.

 

 

SELECT mail_id, sender, recipient, senddate, message

FROM inbox

WHERE (sender = '$userid_users_greatest' AND recipient = '$userid_users_least') OR (sender = '$userid_users_least' AND recipient = '$userid_users_greatest')

ORDER BY senddate DESC

 

I din andra fråga söker du sedan ut alla rader ur meddelande databasen med de villkor du hämtat i den första frågan, och då vecklar du ut allt igen genom att tillåta båda ordningarna (lägst-högst och högst-lägst) i villkoret.

Jag tror jag behöver veta mer om vad du försöker åstadkomma innan jag kan svara på hur det borde se ut.

 

 

 

/Pär B

Länk till kommentar
Dela på andra webbplatser

Hej Pär och tack för analysen.

 

Den gör det mesta rätt av allt det jag vill åstadkomma, förutom dessa skräpvärden.

 

Kan göra en sammanfattning av det jag vill skapa.

 

Jag loggar in med en användare tex id 1014, md7dani

 

Till den användaren finns olka konversationer med andra användare kopplade. Så har jag skickat nåt till tex, Barbro 1051, så blir jag sender och Barbor recipient. Har hon skickat till mig så blir det tvärtom.

 

Jag vill sen rada upp alla konversationer jag har i databasen, genom att söka igenom alla konversationer som är kopplad till min användare och sen rada upp varje unik konversation. Sen ska du kunna klicka på varje unik konversation och få upp alla meddelanden kopplad till användaren, tex Barbro 1051. Detta är löst och testat ok.

 

Så det borde vara enkelt att just plocka ut varje unik konversation och presentera mottagaren(alltid den andra användaren) + senaste meddelandet i en lista.

 

ett ex:

 

Sender recipient meddelande

1014 1051 Hej Barbro 120203

1051 1014 Hej md7dani hur e läget? 120503

1014 1071 Hej Tjorven! 120804

1071 1014 Tja md7dani waz up? 120808

1048 1014 Hej md7dani läget? 121001

1014 1048 Hej bengan jo tack bra. 121002

 

Vilket ska ge:

 

Barbro Hej md7dani hur e läget? 120503

Tjorven Tja md7dani waz up? 120808

bengan Hej bengan jo tack bra. 121002

 

När du klickar på bengan Hej bengan jo tack bra. 121002 , så får du upp (detta funkar också fint):

 

1048 1014 Hej md7dani läget? 121001

1014 1048 Hej bengan jo tack bra. 121002

Länk till kommentar
Dela på andra webbplatser

Hej Pär och tack för analysen.

 

Den gör det mesta rätt av allt det jag vill åstadkomma, förutom dessa skräpvärden.

 

Kan göra en sammanfattning av det jag vill skapa.

 

Jag loggar in med en användare tex id 1014, md7dani

 

Till den användaren finns olka konversationer med andra användare kopplade. Så har jag skickat nåt till tex, Barbro 1051, så blir jag sender och Barbor recipient. Har hon skickat till mig så blir det tvärtom.

 

Jag vill sen rada upp alla konversationer jag har i databasen, genom att söka igenom alla konversationer som är kopplad till min användare och sen rada upp varje unik konversation. Sen ska du kunna klicka på varje unik konversation och få upp alla meddelanden kopplad till användaren, tex Barbro 1051. Detta är löst och testat ok.

 

Så det borde vara enkelt att just plocka ut varje unik konversation och presentera mottagaren(alltid den andra användaren) + senaste meddelandet i en lista.

 

 

Hej!

 

 

Första urvalsfrågan går att förenkla till:

 

SELECT mail_id, sender, recipient, senddate, message
FROM inbox
WHERE sender = $current_user_id OR recipient = $current_userid_id
ORDER BY senddate DESC

 

Detta ger en lista över alla meddelanden med current_user som mottagare eller avsändare.

 

 

 

/Pär B

Länk till kommentar
Dela på andra webbplatser

tusen tack för tipsen. Den verkade hämta rätt värden men skriva ut knasigt, så jag la till lite kod och så funkade det.

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...