php.de

Zurück   php.de > Webentwicklung > Datenbanken

Datenbanken SQL und Co

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 22.01.2010, 18:24  
Neuer Benutzer
 
Registriert seit: 22.01.2010
Beiträge: 25
PHP-Kenntnisse:
Fortgeschritten
trialgod befindet sich auf einem aufstrebenden Ast
Standard Problem mit LEFT JOIN UND WHERE

Hi..

Also ich habe eine Newsseite und die auf der Hauptseite werden die News selber, die Anzahl kommentare und das Rating angezeigt. Bewerten können nur angemeldete User und die nur 1 mal, dannach wird es deaktiviert. Meine Tabellen sehen so aus...

posts:
post_ID | post_content | post_rating | post_status
1 | lalala | 6 | open
2 | lalala2 | -3 | open
...

comments
comment_ID | post_id | comment_content
1 | 2 | toll
2 | 2 | find ich nicht!

rating (damit nicht nochmal bewertet werden kann)
post_id | user_id
1 | 1
2 | 1

sooo.. folgende Abfrage hab ich bisher:
Code:
SELECT
 posts.post_content,
 posts.post_rating,
 COUNT(comments.comment_ID) AS commentanzahl,
 COUNT(rating.post_id) AS ratinganzahl
FROM
 posts
LEFT JOIN
 comments
ON
 post.post_ID = comments.post_id
LEFT JOIN
 rating
ON
 post.post_ID = rating.post_id
WHERE
 post.post_status = 'open' AND rating.user_id = '1'
GROUP BY
 post_ID
So, richtigerweise zeigt er mir ja jetzt nur die an, in der user_id 1 schon bewertet hat.. Wie bzw. wo füge ich diese (die fette) Zeile nun ein, damit das nicht der Fall ist. Der Sinn ist, alles in ein QRY zu packen und nciht in einer WHILE schleif pro Post nochmal einen Extra QRY zu haben...

Geändert von trialgod (22.01.2010 um 18:39 Uhr).
trialgod ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 22.01.2010, 20:39  
erc
Erfahrener Benutzer
 
Registriert seit: 02.01.2009
Beiträge: 730
PHP-Kenntnisse:
Fortgeschritten
erc wird schon bald berühmt werden
Standard

Du machst mit der WHERE Bedingung aus dem LEFT JOIN wieder ein INNER JOIN. Entweder du packst die Bedingung "rating.user_id = '1'" in die ON Klausel oder du prüfst mit (..._id IS NULL OR ..._id = 1)
erc ist offline   Mit Zitat antworten
Alt 26.01.2010, 12:31  
Neuer Benutzer
 
Registriert seit: 22.01.2010
Beiträge: 25
PHP-Kenntnisse:
Fortgeschritten
trialgod befindet sich auf einem aufstrebenden Ast
Standard

So funktioniert es, aber es ist saulahm.. langsamer, als wenn ich die abfrage in eine schleife packe.. jemand idee warum? Das dauert bestimmt 20-30sekunden...

In der posts_ratings können halt auch mal 150000 oder mehr Zeilen drin stehen... Aber wie gesagt in einer Schleife macht er ja prinzipiell das gleiche, da dauerts aber nicht so lang...

Zitat:
oder du prüfst mit (..._id IS NULL OR ..._id = 1)
Das versteh ich nicht so recht..

Geändert von trialgod (26.01.2010 um 12:38 Uhr).
trialgod ist offline   Mit Zitat antworten
Alt 26.01.2010, 12:47  
thomas_w
Gast
 
Beiträge: n/a
Standard

Zitat:
Zitat von trialgod Beitrag anzeigen
So funktioniert es, aber es ist saulahm.. langsamer, als wenn ich die abfrage in eine schleife packe.. jemand idee warum? Das dauert bestimmt 20-30sekunden...
Am Besten mal mit EXPLAIN prüfen, wie MySQL die Abfrage ausführt und das Ergebnis von Explain (z.B. als Bild) hier wieder zeigen. Eventuell fehlen passende Indices, um MySQL bei der Abfrage zu helfen und zu beschleunigen.

Code:
mysql> EXPLAIN SELECT ....
Grüße
Thomas
  Mit Zitat antworten
Alt 26.01.2010, 12:59  
Neuer Benutzer
 
Registriert seit: 22.01.2010
Beiträge: 25
PHP-Kenntnisse:
Fortgeschritten
trialgod befindet sich auf einem aufstrebenden Ast
Standard

hier die druckansicht von phpmyadmin.. ich muss sagen, ich kann nciht sehr viel damit anfangen^^
Miniaturansicht angehängter Grafiken
problem-mit-left-join-und-where-sql.jpg  
trialgod ist offline   Mit Zitat antworten
Alt 26.01.2010, 13:17  
thomas_w
Gast
 
Beiträge: n/a
Standard

es zeigt, das MySQL keinerlei Indices verwenden kann, um die Abfrage zu beschleunigen (siehe Spalte possible_key und key )

Hilfreich wären zwei neue/zusätzliche Key oder Indices.

Code:
CREATE INDEX sx_tb_posts_01 ON tb_posts(post_id);
CREATE INDEX sx_tb_posts_ratings_01 ON tb_posts_ratings(post_id, user_id);
Diese mal anlegen und den EXPLAIN nochmal ausführen. Die Indices können später problemlos mit DROP INDEX entfernt werden, falls dies nichts bringt.

Grüße
Thomas
  Mit Zitat antworten
Alt 26.01.2010, 13:25  
Neuer Benutzer
 
Registriert seit: 22.01.2010
Beiträge: 25
PHP-Kenntnisse:
Fortgeschritten
trialgod befindet sich auf einem aufstrebenden Ast
Standard

Boah Hammer.. jetzt gehts ratzfatz.. RIESEN DANK!

Ich hab nie verstanden (und mich auch nicht groß drum gekümmert), für was die Indices da sind.. PHPMYADMIN hat mir das ja immer Rot angezeigt, dass die nicht gesetzt sind.. aber naja..

DANKE!
trialgod ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[Erledigt] left join problem Bernd-m Datenbanken 9 24.08.2009 13:52
[Erledigt] SQL Anweisung sadry PHP Tipps 2009 38 20.08.2009 11:28
[Erledigt] LEFT JOIN Daten ausgeben bei 1:n Beziehung Asipak PHP Tipps 2009 11 01.08.2009 15:27
JOIN und LEFT JOIN verbinden? Dynamite53 Datenbanken 8 15.05.2009 15:16
Persistence Framework #Avedo Software-Design 37 28.03.2009 17:32
join array output Problem Rilana PHP Tipps 2008 3 17.11.2008 10:47
[Erledigt] LEFT JOIN verliert Datensätze JudGer Datenbanken 4 05.10.2008 17:53
Left Join.. mit ON 2 Spalten holen? kleenerandi PHP Tipps 2008 0 31.03.2008 22:48
JOIN Problem pPanther Datenbanken 7 06.03.2008 17:26
JOIN / LEFT JOIN und Co prinzli Datenbanken 12 05.11.2007 22:15
Komplexes Join Problem pPanther Datenbanken 7 03.08.2007 23:16
[solved] LEFT JOIN - #1066 - Not unique table/alias moose Datenbanken 6 12.12.2006 06:41
[gelöst] LEFT JOIN und trotzdem nicht alle Sätze da?!? stefanjann Datenbanken 3 24.10.2006 11:32
Problem mit Where und Join Datenbanken 5 06.07.2005 18:05
Problem mit dem WHERE Befehl PHP Tipps 2004 5 08.07.2004 00:03

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
left join where, left join where post, left join und where, left join, php left join where, left join mit where, left join bringt null, left join bedingungen, problem with left join, mysql sobald left join keine ausgabe mehr, select left join where <= problem

Alle Zeitangaben in WEZ +2. Es ist jetzt 09:33 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum