php.de

Zurück   php.de > Webentwicklung > Datenbanken

Datenbanken SQL und Co

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 20.11.2011, 04:35  
Erfahrener Benutzer
 
Registriert seit: 21.09.2010
Beiträge: 143
PHP-Kenntnisse:
Anfänger
Zulakis befindet sich auf einem aufstrebenden Ast
Standard sql ausführungszeit

Hi,

ich habe ein table `updates` mit den Spalten room, id. Ich möchte nun den jeweils neuesten Eintrag von room kriegen.

Meine aktuelle Query ist

Code:
SELECT *
FROM `updates`

WHERE CONCAT( room, id )
IN (
SELECT CONCAT( room, MAX( id ) )
FROM `updates`
GROUP BY room
)
AND user != 'a'
AND id NOT
IN (

SELECT updateid
FROM gotupdates
WHERE user = 'a'
)
...dauert schon bei 2000 Einträgen ganze 7 Sekunden.

Wie mache ich das besser?

Edit:

Hab mal ein Join versucht:

Code:
SELECT *
FROM `updates`
INNER JOIN (

SELECT room, MAX( id ) max_version
FROM updates
WHERE user != 'a'
GROUP BY room
) AS max_Vers_je_Id ON updates.room = max_Vers_je_Id.room
AND updates.id = max_Vers_je_Id.max_version
AND id NOT
IN (

SELECT updateid
FROM gotupdates
WHERE user = 'a'
)
läuft damit schon schneller. Geht es noch besser?

Geändert von Zulakis (20.11.2011 um 05:05 Uhr).
Zulakis ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 20.11.2011, 11:29  
Erfahrener Benutzer
 
Registriert seit: 03.08.2010
Beiträge: 300
PHP-Kenntnisse:
Fortgeschritten
Asterixus sorgt für eine eindrucksvolle AtmosphäreAsterixus sorgt für eine eindrucksvolle Atmosphäre
Asterixus eine Nachricht über Skype™ schicken
Standard

Die beste Lösung wäre, deine Datenbankstruktur zu normalisieren. Ohne genau zu wissen, was du willst, habe ich mal das gemacht:
Code:
select
	*
from
	updates
inner join
	updates max_table
on
	updates.room = max_table.room and
	updates.id = max(max_table.id)
left join
	gotupdates
on
	gotupdates.updateid = updates.id and
	gotupdates.user = 'a'
where
	updates.user <> 'a' and
	gotupdates.updateid is null
group by
	max_table.room

Geändert von Asterixus (20.11.2011 um 11:32 Uhr).
Asterixus ist offline   Mit Zitat antworten
Alt 21.11.2011, 09:54  
Erfahrener Benutzer
 
Registriert seit: 21.09.2010
Beiträge: 143
PHP-Kenntnisse:
Anfänger
Zulakis befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von Asterixus Beitrag anzeigen
Die beste Lösung wäre, deine Datenbankstruktur zu normalisieren. Ohne genau zu wissen, was du willst, habe ich mal das gemacht:
Code:
select
	*
from
	updates
inner join
	updates max_table
on
	updates.room = max_table.room and
	updates.id = max(max_table.id)
left join
	gotupdates
on
	gotupdates.updateid = updates.id and
	gotupdates.user = 'a'
where
	updates.user <> 'a' and
	gotupdates.updateid is null
group by
	max_table.room
PHP-Code:
#1111 - Invalid use of group function 
Sieht für meine Augen aber von der Struktur her richtig aus.
Zulakis ist offline   Mit Zitat antworten
Alt 21.11.2011, 11:06  
Erfahrener Benutzer
 
Registriert seit: 02.09.2009
Beiträge: 1.019
PHP-Kenntnisse:
Fortgeschritten
mquadrat befindet sich auf einem aufstrebenden Ast
Standard

Schwierig ohne die Struktur zu kennen, aber müsste das nicht so in etwa gehen? Annahme: Es geht um genau einen User

Code:
  select 
    updates.*
  from updates
    join gotupdates on updates.id = gotupdates.updateid
  where
    <where Bedingungen>
  order by updates.id desc
  limit 0,1
So ganz blicke ich aber bei dem user != 'a' / user = 'a' grad nicht durch Also vielleicht mal kurz beschreiben, was das Statement eigentlich tun soll
__________________
Wir suchen PHP Entwickler (Vollzeit) im Raum Darmstadt / Rhein-Main. Infos via E-Mail mueller@new-frontiers.de
mquadrat ist offline   Mit Zitat antworten
Alt 21.11.2011, 16:14  
Erfahrener Benutzer
 
Registriert seit: 21.09.2010
Beiträge: 143
PHP-Kenntnisse:
Anfänger
Zulakis befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von mquadrat Beitrag anzeigen
Schwierig ohne die Struktur zu kennen, aber müsste das nicht so in etwa gehen? Annahme: Es geht um genau einen User

Code:
  select 
    updates.*
  from updates
    join gotupdates on updates.id = gotupdates.updateid
  where
    <where Bedingungen>
  order by updates.id desc
  limit 0,1
So ganz blicke ich aber bei dem user != 'a' / user = 'a' grad nicht durch Also vielleicht mal kurz beschreiben, was das Statement eigentlich tun soll
2 Tabellen - eine in der die updates gespeichert wurden, eine zweite in der steht welcher user das jeweilige update bereits erhalten hat. Die Room-ID könnte man so erklären, dass updates für die gleiche software immer die gleiche Room-ID kriegen und so immer nur das jeweils aktuellste update ausgefliefert werden soll.
Zulakis ist offline   Mit Zitat antworten
Alt 22.11.2011, 11:31  
Erfahrener Benutzer
 
Registriert seit: 13.05.2011
Beiträge: 188
PHP-Kenntnisse:
Fortgeschritten
php1704 wird schon bald berühmt werden
Standard

Code:
EXPLAIN SELECT bla FROM blub WHERE usw....
ist ein guter Anhaltspunkt bei der Optimierung.

Grüße.
php1704 ist offline   Mit Zitat antworten
Alt 22.11.2011, 12:17  
Erfahrener Benutzer
 
Registriert seit: 02.09.2009
Beiträge: 1.019
PHP-Kenntnisse:
Fortgeschritten
mquadrat befindet sich auf einem aufstrebenden Ast
Standard

Und du möchtest nun welche Aussage aus der Query haben? Das höchste ausgelieferte Update je Room-ID? Oder das niedrigste noch nicht ausgelieferte? Und wie passt da nun der User rein?
__________________
Wir suchen PHP Entwickler (Vollzeit) im Raum Darmstadt / Rhein-Main. Infos via E-Mail mueller@new-frontiers.de
mquadrat ist offline   Mit Zitat antworten
Alt 22.11.2011, 13:21  
Erfahrener Benutzer
 
Registriert seit: 21.09.2010
Beiträge: 143
PHP-Kenntnisse:
Anfänger
Zulakis befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von mquadrat Beitrag anzeigen
Und du möchtest nun welche Aussage aus der Query haben? Das höchste ausgelieferte Update je Room-ID? Oder das niedrigste noch nicht ausgelieferte? Und wie passt da nun der User rein?
Das neueste (also höchste ID) noch nicht ausgelieferte Update. Die updates werden an jeden User einzeln ausgeliefert und danach die Bestätigung in 'gotupdates' gespeichert.
Zulakis ist offline   Mit Zitat antworten
Alt 23.11.2011, 00:50  
Moderator
 
Benutzerbild von Chriz
 
Registriert seit: 11.05.2008
Beiträge: 6.266
Chriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer Anblick
Standard

Lange Queryzeiten bei wenig Daten => vermutlich kein Index gesetzt.

Poste doch mal die Struktur + ein knappes Beispiel.
__________________
"Nuschel ich?" - "Was?"
Chriz ist gerade online   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
' Zeichen zur SQL Speicherung maskieren noop PHP Einsteiger 1 07.11.2011 18:24
[Erledigt] Case führt nicht alle SQL Abfragen aus Angel PHP Einsteiger 2 05.09.2011 12:20
SQL Statement mit UPDATE und SELECT: fetch_array Micodat Datenbanken 2 21.04.2011 18:09
[Erledigt] SQL Abfrage escapen wooha PHP Einsteiger 3 18.04.2011 10:13
[Erledigt] SQL zweistufige Abfrage Elefterios Datenbanken 12 13.03.2011 15:23
[Erledigt] SQL WHERE ohne mehrere SQL Abfragen Soulstormer Datenbanken 10 01.03.2011 16:26
SQL Abfrage INNER JOIN etc. chr1s-eg Datenbanken 4 01.03.2011 13:37
Problem mit PHP Variablen in SQL Befehl Noahndertaler Datenbanken 2 26.01.2011 17:14
Forum - neusten Beiträge anzeigen sql langsam jackie1983 Datenbanken 11 06.01.2011 19:57
Use The Index, Luke! - SQL Tuning Resource Markus Winand Datenbanken 0 04.12.2010 11:12
False Abfrage und SQL hängt sich auf marc77 Datenbanken 4 22.11.2010 14:57
SQL Intervall // Format übergeben noop PHP Tipps 2010 6 11.11.2010 12:32
SQL Datei mit PHP ausführen Kein Genie PHP Tipps 2010 2 09.11.2010 09:52

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
sql ausführung zeit

Alle Zeitangaben in WEZ +2. Es ist jetzt 15:34 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