Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

MySQL - Abfrage vereinfachen

Frage Entwicklung Datenbanken

Mitglied: EvilMoe

EvilMoe (Level 2) - Jetzt verbinden

01.08.2008, aktualisiert 03.08.2008, 3668 Aufrufe, 8 Kommentare

Ich habe hier 2 SQL Befehle die in einer Schleife ausgeführt werden. Die Schleife hatt 100 und mehr durchläufe! Dem entsprechen dauert das generieren der Seite auch ein wenig.

Als ersten führ ich ein normalen "SELECT id, datei" aus auf einer Tabelle. Die läuft dann in der Schleife durch und gibt diese aus. Aber ich brauche noch 2 Werte. Und deswegen habe ich noch 2 Abfragen in der Schleife. Die sehen so aus:

01.
 // $row->id ist die ID die von dem "SELECT *" kommt. 
02.
 $sql = sprintf("SELECT COUNT(id) as votes FROM votes WHERE trackid='%d' LIMIT 1", $row->id); 
03.
 
04.
  
05.
 $sql = sprintf("SELECT COUNT(id) as anz FROM votes WHERE trackid='%d' AND ip='%s' LIMIT 1", $row->id, md5($_SERVER['REMOTE_ADDR'])); 
06.
 
07.
 
Gibt es eine möglichkeit das einfacher/schneller zu lösen so das der Server schneller die Ergebnisse liefert?
Mitglied: Biber
02.08.2008 um 00:00 Uhr
Moin EvilMoe,

geht es nicht mit einem SubSelect?
01.
SELECT t.id, t.datei, v1.votes, v2.anz 
02.
From tabelle t,  
03.
(select trackid, count(id) as votes from votes 
04.
group by trackid ) v1, 
05.
(select trackid, ip, count(id) as Anz from votes 
06.
group by trackid, ip ) v2 
07.
Where  
08.
t.id = v1.trackid and 
09.
t.id = v2.trackid and 
10.
v2.ip = md5($_SERVER['REMOTE_ADDR']);
Grüße
Biber
P.S. Ist natürlich nur getippt, nicht getestet....
Bitte warten ..
Mitglied: EvilMoe
02.08.2008 um 01:09 Uhr
Danke erstmal.

ich habe nun folgenden SQL:

01.
   
02.
     $sql = "SELECT t.id, t.datei, v1.votes, v2.votet FROM  
03.
   		tracks as t, 
04.
		(SELECT trackid, COUNT(id) as votes FROM votes GROUP BY trackid) as v1 , 
05.
		(SELECT ip, trackid, COUNT(id) as votet FROM votes GROUP BY trackid, ip ) as v2  
06.
			 
07.
			WHERE t.id = v1.trackid AND 
08.
				  t.id = v2.trackid AND  
09.
				  v2.ip = '".md5($_SERVER['REMOTE_ADDR'])."' 
10.
		";
Dort habe ich noch 2 Probleme.

Ich brauche alle Ergebnisse aus der Tabelle tracks AUCH wenn die ID nicht in votes ist (dort ist das die trackid).

Man bekommt nur ein Ergebnis wenn die IP übereinstimmt. Muss aber auch gehen wenn sie nicht übereinstimmt (dann soll votes=0 sein und votet auch).

Tut mir leid. Ich bin leider nicht so ein SQL Freak...
Bitte warten ..
Mitglied: Biber
02.08.2008 um 03:26 Uhr
Moin EvilMoe,

Ich bin leider nicht so ein SQL Freak...
Ich auch nicht - ich kann auch in meiner Küche viel pfiffigere Sachen zusammenbraten als hier im Forum...

Wenn Du auch die Sätze ohne Child-Summen (bzw. mit Summe 0) brauchst, dann klappt es mit dem Inner Join (alle Sätze, die in allen verknüpften Tabellen sind) natürlich nicht.
Das hatte ich falsch verstanden bzw. interpretiert.
01.
   
02.
     $sql = "SELECT t.id, t.datei,  
03.
    Case when v2.votet is null then 0 
04.
            else v1.votes 
05.
        end as votes, 
06.
      , Case when v2.votet is null then 0 
07.
        else v2.votet 
08.
        end as votet 
09.
       FROM tracks as t  
10.
  LEFT JOIN 
11.
     (SELECT trackid, COUNT(id) as votes  
12.
       FROM votes GROUP BY trackid) as v1 on t.id = v1.trackid 
13.
   Left Join   
14.
      (SELECT ip, trackid, COUNT(id) as votet  
15.
        FROM votes  
16.
       Where ip = '".md5($_SERVER['REMOTE_ADDR'])."' 
17.
     GROUP BY trackid, ip ) as v2  on t.trackid=v2.id";
Grüße
Biber
Bitte warten ..
Mitglied: EvilMoe
02.08.2008 um 09:35 Uhr
In der SQL Abfrage hab ich jetzt einen Syntax Fehler.

Ich verstehe auch gerade die Case anfragen nicht ganz. Das Feld votet gibts nicht. Ich hatte den nur als Alias verwendet. votet soll true ergeben wenn unter votes die trackid und die IP übereinstimmt andernfalls false.

01.
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ' Case when v2.votet is null then 0 else v2.votet end as votet ' at line 5
Bitte warten ..
Mitglied: Biber
02.08.2008 um 19:17 Uhr
Moin EvilMoe,

Sorry, aber meiner Meinung ist da nur ein Komma zuviel - zwischen den beiden CASE-Anweisungen sind zwei aufeinanderfolgende.

Sonst sehe ich keinen Entwurfsfehler.
Nur Testen kann ich es nicht, weil ich SQL nur aus Kreuzworträtseln kenne und nix auf dem Rechner habe.

Grüße
Biber
Bitte warten ..
Mitglied: EvilMoe
02.08.2008 um 22:15 Uhr
Ohh das hab ich auch übersehen. Nun sind wir der Lösung schon ganz nahe! Funktioniert schonmal sehr gut. Aber ein Fehler konnt ich noch festellen.

v1.votes liefert 0 ergebnisse obwohl 1 Treffer ist. Wenn 2 Treffer sind zeigt er auch 2 an aber wenn nur einer ist eben nicht.

Aber wenn man selber dafür gevotet hat zeigt er eine 1 an! Also wenn die IP übereinstimmt.

Momentan siehts so aus (unten haste 2 Werte vertauscht, war aber nicht tragisch konnte es ausfindig machen):

01.
SELECT t.id, t.datei,  
02.
    		Case when v2.votet is null then 0 else v1.votes end as votes, 
03.
      		Case when v2.votet is null then 0 else v2.votet end as votet 
04.
       		FROM tracks as t 
05.
			  LEFT JOIN 
06.
				 (SELECT trackid, COUNT(id) as votes  
07.
				   FROM votes GROUP BY trackid) as v1 on t.id = v1.trackid 
08.
			   Left Join   
09.
				  (SELECT ip, trackid, COUNT(id) as votet  
10.
					FROM votes  
11.
				   Where ip = '".md5($_SERVER['REMOTE_ADDR'])."' 
12.
				 GROUP BY trackid, ip ) as v2  on t.id=v2.trackid ORDER BY datei 
13.
 

EDIT: Muss mich nochmal korregieren. v1.votes ergibt immer 0 wenn man nicht auch dafür gevotet hat (also die IP muss auch stimmen sonst immer 0)!
Bitte warten ..
Mitglied: Biber
03.08.2008 um 05:34 Uhr
Moin EvilMoe,

Man bekommt nur ein Ergebnis wenn die IP übereinstimmt. Muss aber auch gehen wenn sie nicht übereinstimmt (dann soll votes=0 sein und votet auch).

Jepp, so habs ich umgesetzt. Und nach Deiner letzten Beschreibung tut es das ja - works as designed.
Wenn "votes" immer als votes-Wert angezeigt werden soll, dann logischerweise statt des ersten CASE-Geraffels einfach "votes" schreiben.

Und bitte diesen Beitrag auf "erledigt" setzen.

Danke
Biber
Bitte warten ..
Mitglied: EvilMoe
03.08.2008 um 08:57 Uhr
Okay. So funktioniert das wunderbar!!! Vielen danke Biber!


So siehts fertig aus
01.
SELECT t.id, t.datei,  
02.
    		Case when v1.votes is null then 0 else v1.votes end as votes, 
03.
      		Case when v2.votet is null then 0 else v2.votet end as votet 
04.
       		FROM tracks as t 
05.
			  LEFT JOIN 
06.
				 (SELECT trackid, COUNT(id) as votes  
07.
				   FROM votes GROUP BY trackid) as v1 on t.id = v1.trackid 
08.
			   Left Join   
09.
				  (SELECT ip, trackid, COUNT(id) as votet  
10.
					FROM votes  
11.
				   Where ip = '".md5($_SERVER['REMOTE_ADDR'])."' 
12.
				 GROUP BY trackid, ip ) as v2  on t.id=v2.trackid ORDER BY datei
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(1)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
PHP
MySQL-Abfrage mit php: Wert + true bzw. false (2)

Frage von tomolpi zum Thema PHP ...

Datenbanken
gelöst MYSQL Abfrage (20)

Frage von datadexx zum Thema Datenbanken ...

Datenbanken
gelöst SQL-Abfrage - DISTINCT - letztes Datum (3)

Frage von emeriks zum Thema Datenbanken ...

Datenbanken
gelöst Row Number bei einer Abfrage sinnvoll einsetzen (1)

Frage von Aximand zum Thema Datenbanken ...

Heiß diskutierte Inhalte
LAN, WAN, Wireless
gelöst Server erkennt Client nicht wenn er ausserhalb des DHCP Pools liegt (28)

Frage von Mar-west zum Thema LAN, WAN, Wireless ...

Outlook & Mail
Outlook 2010 findet ost datei nicht (18)

Frage von Floh21 zum Thema Outlook & Mail ...

Windows Server
Server 2008R2 startet nicht mehr (Bad Patch 0xa) (18)

Frage von Haures zum Thema Windows Server ...