Top-Themen

Aktuelle Themen (A bis Z)

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

Mitglied: EvilMoe

EvilMoe (Level 2) - Jetzt verbinden

01.08.2008, aktualisiert 03.08.2008, 3736 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 ..
Ähnliche Inhalte
Datenbanken
MYSQL Abfrage
gelöst Frage von datadexxDatenbanken20 Kommentare

Halo an alle MySQL Spezialisten! Wie kann ich denn am besten folgende Werte abfragen und berechnen? Ausgang für die ...

Microsoft Office
Vereinfachen einer Schleife
Frage von Jens1975Microsoft Office1 Kommentar

Hallo, ich bin neu und versuche mich jetzt mit VBA Ich möchte die Funktion Autofill durch eine Schleife ersetzen. ...

PHP
PHP MySQL Abfrage aus Datenbank
Frage von Lost144PHP12 Kommentare

Hallo, Ich habe in einer Datenbank daten über VM's stehen. Angaben wie hostname,adresse, serverat usw. Wie kann ich in ...

Datenbanken
MYSQL Abfrage bereitet mir Probleme
gelöst Frage von datadexxDatenbanken43 Kommentare

Hallo Leute, ich habe wieder ein Problem mit einer SQL Abfrage. Ich habe eine Tabelle die nennt sich pbooking, ...

Neue Wissensbeiträge
Humor (lol)
IoT-Gefahr: Smartes Aquarium leckt!
Information von Lochkartenstanzer vor 1 TagHumor (lol)3 Kommentare

Moin, Die IoT-Manie hat weitere Opfer gefunden. Ein Casino-Leck durch ein smartes Aquarium: Allerdings haben sie kein Wasser, sondern ...

Router & Routing

Alte Fritzbox 7270 mit VPN und SIP-Telefonie hinter O2 Homebox 6641 als "Modem"

Erfahrungsbericht von the-buccaneer vor 1 TagRouter & Routing3 Kommentare

Nun war es soweit: Auch O2 hat mich mit VOIP zwangsbeglückt. Heute am Privatanschluss, in 2 Wochen ist das ...

Sicherheit

Ungepatchte Remote Code Execution-Lücke in LG NAS

Information von kgborn vor 2 TagenSicherheit

Nutzt wer LG NAS-Einheiten? In den NAS-Einheiten der LG Network Storage-Einheiten gibt es eine sehr unschöne Schwachstelle, die einen ...

Windows Update

Neue Version KB4099950 NIC Einstellungen gehen verloren

Information von sabines vor 2 TagenWindows Update2 Kommentare

Es ist eine neue Version des KB4099950 verfügbar, die das Problem mit den verlorenen Netzwerkeinstellungen lösen soll. Das Datum ...

Heiß diskutierte Inhalte
Router & Routing
Mikrotik: Routing zwischen Interfaces mit Geräten ohne Gateway
Frage von TonLichtVideoRouter & Routing18 Kommentare

Hallo zusammen, ich komme aus dem Veranstaltungstechnik Bereich und habe zwei Netze um verschiedene Hardware zu Remoten. CONTROL1 192.168.1.0/24 ...

Linux Netzwerk
Raspberry Pi 3: WLAN Power save deaktivieren
Frage von nordie92Linux Netzwerk14 Kommentare

Moin moin, mein Raspberry Pi 3 Model B benötigt eine dauerhaft aktive WLAN-Verbindung. Leider bricht die WLAN-Verbindung nach einigen ...

SAN, NAS, DAS
Entscheidung SAN Dell oder HP
Frage von VincorSAN, NAS, DAS13 Kommentare

Hallo, wir wollen uns für unsere Hyper V Umgebung eine neue SAN Anschaffen. Es laufen 30 VM's darunter, DC; ...

Vmware
Server 2008 r2 vmware terminalserver
Frage von MasterCVmware10 Kommentare

Guten Abend zusammen, ich hoffe , dass einer von euch mir weiterhelfen kann ,bei meinem kack Problem ! Ist ...