Subquery vs Join, tips på optimering

PHPportalen Forum Index » Databaser
Lägg ett bokmärke på hela tråden
Skapa nytt inlägg   Svara på inlägget
Visa föregående ämne :: Visa nästa ämne  
Startad av: Meddelande
qulle



Medlem i: 461 dagar

Status: Offline



#741174
Inlägg Skrivet: 2016-11-05 20:21      Ämne: Subquery vs Join, tips på optimering Citera

Tjena

Har en kod som funkar gör precis det jag vill.
Lite kort sagt så hämtar den kommentarerna som hör till post 1
och hämtar in användarnamnet från user tabellen och hämtar/summerar dess rating från en tabell.

KOD:
1:
 
2:
select forum_comments.*, users.username,
3:
   (select ifnull(sum(forum_likes.value), 0)
4:
      from forum_likes
5:
      where forum_likes.comment_id = forum_comments.id) as rating
6:
from forum_comments
7:
 
8:
left join users on forum_comments.user_id = users.id
9:
where forum_comments.post_id = 1
10:
 
11:
order by forum_comments.created DESC
12:
 



Är det dock någon som har förslag på hur man skriver om detta genom att köra 2 join och på så sätt kanske
slippa sub-select satsen ? Alltså en join för användarnamnet och en join för kommentarens rating..

Får bra exekveringstider av min kod men läste att det är mer skonsamt och effektivt att köra med join men får inte riktigt till det som jag vill...

// Q
 
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
Koenigsegg



Medlem i: 2992 dagar

Status: Offline



#741176
Inlägg Skrivet: 2016-11-06 00:55      Ämne: Citera

Nåt i stil med det uppenbara Smile?

KOD:
1:
select forum_comments.*, users.username, ifnull(sum(forum_likes.value), 0) as rating
2:
from forum_comments
3:
 
4:
left join forum_likes on forum_likes.comment_id = forum_comments.id
5:
left join users on forum_comments.user_id = users.id
6:
where forum_comments.post_id = 1
7:
 
8:
order by forum_comments.created DESC


Men man kan ju säga andra saker också.. "Rör det inte om det fungerar", t.ex. Du säger ju själv att det du har nu duger sett till prestanda.

Och att subqueries alltid är sämre än joins vet jag inte om jag vill hålla med om. Men i det här fallet med en dependent subquery så kan det nog stämma. https://dev.mysql.com/doc/refman/5.6/en/subquery-optimization.html t.ex, för den som vill läsa mera.
 
Till toppen på sidan
Visa användarprofil Skicka privat meddelande MSN Messenger
qulle



Medlem i: 461 dagar

Status: Offline



#741177
Inlägg Skrivet: 2016-11-06 11:03      Ämne: Citera

Har redan provat det uppenbara Wink men det blir inte samma resultat. Då hämtas endast en rad och summeringen av rating blir fel...
Tar jag bort sum() funktionen
KOD:
1:
select forum_comments.*, users.username, ifnull(forum_likes.value, 0) as rating

så hämtas alla rader (dock är ju ratingen då endast joinad med övriga värden), så problemet verkar vara i sum funktionen.


Det var mest som en lärorik övning att försöka göra om koden då jag är nöjd med resultatet från den första.
 
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
Koenigsegg



Medlem i: 2992 dagar

Status: Offline



#741178
Inlägget är accepterad som det rätta svaret Skrivet: 2016-11-07 00:32      Ämne: Citera

SUM() är en aggregerande funktion, den lägger ihop alla rader som påträffas och ger en rad som svar. Därför så kan det vara idé att undvika databasfrågor som blandar aggregerande och icke aggregerande - för hur väljer man vilken rads data som ska visas i de icke aggregerande kolumnerna?

Kan
KOD:
1:
SELECT ... FROM ... GROUP BY ...
kanske vara nåt för dig? Då delar du upp påträffade rader i grupper, så att agregerande funktioner inte slår ihop allt till en rad, utan bara det inom gruppen. M.a.o så blir antalet rader i resultatet lika med antalet olika grupper..
 
Till toppen på sidan
Visa användarprofil Skicka privat meddelande MSN Messenger
qulle



Medlem i: 461 dagar

Status: Offline



#741186
Inlägg Skrivet: 2016-11-11 20:01      Ämne: Citera

Perfekt, GROUP BY funkade perfekt!

KOD:
1:
 
2:
SELECT forum_comments.*, users.username, IFNULL(SUM(forum_likes.value), 0) AS rating
3:
         FROM forum_comments
4:
         LEFT JOIN forum_likes ON forum_likes.comment_id = forum_comments.id
5:
         LEFT JOIN users ON forum_comments.user_id = users.id
6:
         WHERE forum_comments.post_id = :id
7:
         GROUP BY forum_comments.id
8:
         ORDER BY forum_comments.created DESC
9:
 
 
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
Visa tidigare inlägg:   
Skapa nytt inlägg   Svara på inlägget
PHPportalen Forum Index » Databaser
Hoppa till:  
Du kan inte skapa nya inlägg i det här forumet
Du kan inte svara på inlägg i det här forumet
Du kan inte ändra dina inlägg i det här forumet
Du kan inte ta bort dina inlägg i det här forumet
Du kan inte rösta i det här forumet
Du kan inte bifoga filer i detta forum
Du kan inte ladda ner filer från detta forum
Kontakta oss på adressen: info@phpportalen.net
Webbplatsen bygger i grunden på phpBB © 2001, 2002 phpBB Group

Modifieringar har senare gjorts i systemet av PHPportalen
Sid och logotypdesign skapad av Daren Jularic