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

Frage Entwicklung Datenbanken

GELÖST

MySQL - Abfrage vereinfachen

Mitglied: EvilMoe

EvilMoe (Level 2) - Jetzt verbinden

01.08.2008, aktualisiert 03.08.2008, 3724 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. ...

Datenbanken
MySQL Abfrage für eine Umsatzauswertung kombinieren
gelöst Frage von RedBullmachtfitDatenbanken2 Kommentare

Hallo zusammen, ich möchte Kundenumsätze aus einer MySQL (v5.6, Windows) Datenbank ziehen. Ich komme mit der Struktur jedoch nicht ...

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 ...

Neue Wissensbeiträge
Linux

Meltdown und Spectre: Linux Update

Information von Frank vor 1 TagLinux

Meltdown (Variante 3 des Prozessorfehlers) Der Kernel 4.14.13 mit den Page-Table-Isolation-Code (PTI) ist nun für Fedora freigegeben worden. Er ...

Tipps & Tricks

Solutio Charly Updater Fehlermeldung: Das Abgleichen der Dateien in -Pfad- mit dem Datenobject ist fehlgeschlagen

Tipp von StefanKittel vor 2 TagenTipps & Tricks

Hallo, hier einmal als Tipp für alle unter Euch die mit der Zahnarztabrechnungssoftware Charly von Solutio zu tun haben. ...

Sicherheit

Meltdown und Spectre: Wir brauchen eine "Abwrackprämie", die die CPU-Hersteller bezahlen

Information von Frank vor 2 TagenSicherheit12 Kommentare

Zum aktuellen Thema Meltdown und Spectre: Ich wünsche mir von den CPU-Herstellern wie Intel, AMD oder ARM eine Art ...

Sicherheit

Meltdown und Spectre: Realitätscheck

Information von Frank vor 2 TagenSicherheit10 Kommentare

Die unangenehme Realität Der Prozessorfehler mit seinen Varianten Meltdown und Spectre ist seit Juni 2017 bekannt. Trotzdem sind immer ...

Heiß diskutierte Inhalte
Batch & Shell
Meltdown Microsoft Prüf Script - .zip Datei leider leer
gelöst Frage von MasterBlaster88Batch & Shell13 Kommentare

Hallo zusammen, ich patche gerade unsere Windows Server bzgl. der Meltdown Lücke. Patch vorhanden, Reg Keys gesetzt Um das ...

Batch & Shell
Shell-Skript - Syntax error: Unterminated quoted string
Frage von newit1Batch & Shell13 Kommentare

Hallo Ich schreibe ein Skript das eine CSV-Datei in eine mySQL Datenbank schieben soll. Bekomme nach start des Skrips ...

E-Mail
Erfahrungen mit hMailServer gesucht
Frage von it-fraggleE-Mail10 Kommentare

Hallo, meine neue Stelle möchte einen eigenen Mailserver. Ich als Linuxkind war direkt geistig mit Postfix dabei. Leider wollen ...

Entwicklung
VBS: alle PDF-Dateien in einem Ordner gleichzeitig öffnen
gelöst Frage von JuweeeEntwicklung9 Kommentare

Hallo, ich habe in deiner Ordnerstruktur (.\Tagesberichte\xx.18\) mehrere dynamische PDF-Formulare (mit LCD erstellt). Die Berichtsformulare sind im Layout alle ...