20 Stimmen

mysql-Abfrage: SELECT DISTINCT Spalte1, GROUP BY Spalte2

Im Moment habe ich die folgende Abfrage:

SELECT name, COUNT(name), time, price, ip, SUM(price) 
  FROM tablename 
 WHERE time >= $yesterday 
   AND time <$today GROUP BY name

Und was ich tun möchte, ist eine DISTINCT nach Spalte "ip", d. h. hinzufügen.

SELECT DISTINCT ip FROM tablename 

So meine endgültige Ausgabe wäre alle Spalten, aus allen Zeilen, wo Zeit ist heute, gruppiert nach Namen (mit Namen zählen für jede Wiederholung Namen) und keine doppelte IP-Adressen.

Wie sollte meine Anfrage aussehen? (oder alternativ, wie kann ich den fehlenden Filter zur Ausgabe mit php hinzufügen)?

Vielen Dank im Voraus.


[UPDATE]

Um die Verwirrung zu minimieren, betrachten Sie diese (vereinfachte) db-Tabelle:

|   name   |   ip   |
---------------------
|  mark    |  123   |
|  mark    |  123   |
|  mark    |  456   |
|  dave    |  789   |
|  dave    |  087   |

Das gewünschte Ergebnis wäre eine HTML-Tabelle, die wie folgt aussieht:

|  name    |  name count   |
----------------------------
|  mark    |      2        |
|  dave    |      2        |

Was ich derzeit bekomme, ist:

|  name    |  name count   |
----------------------------
|  mark    |      3        |
|  dave    |      2        |

(es zählt 3 Mal, auch wenn zwei Mal die gleiche IP verwendet wird).

0 Stimmen

Ich habe auch versucht SELECT DISTINCT ip FROM (SELECT name, COUNT(name), time, price, ip, SUM(price) FROM tablename WHERE time >= $yesterday AND time <$today GROUP BY name) as TABLE Aber ich bekomme einen Syntaxfehler...

0 Stimmen

Versuchen Sie es: EINZELN AUSWÄHLEN TABELLE.ip FROM (SELECT T.name, COUNT(T.name), T.time, T.price, T.ip, SUM(T.price) FROM tabellenname T WHERE time >= $yesterday AND time <$today GROUP BY name) as TABLE

0 Stimmen

- "Das angegebene Argument ist keine gültige MySQL-Ergebnisressource" :(

62voto

knittl Punkte 214432

Sie können verwenden COUNT(DISTINCT ip) werden z. B. nur eindeutige Werte gezählt:

SELECT name, COUNT(name), time, price, COUNT(DISTINCT ip), SUM(price) 
  FROM tablename 
 WHERE time >= :yesterday 
   AND time < :today GROUP BY name

13voto

Mark Byers Punkte 761508

Ersetzen von FROM tablename mit FROM (SELECT DISTINCT * FROM tablename) sollte das gewünschte Ergebnis liefern (doppelte Zeilen werden ignoriert):

SELECT name, COUNT(*)
FROM (SELECT DISTINCT * FROM Table1) AS T1
GROUP BY name

Ergebnis für Ihre Testdaten:

dave 2
mark 2

4voto

Andy Punkte 16773

Sie können einfach die DISTINCT(ip) aber sie muss am Anfang der Abfrage stehen. Achten Sie darauf, PHP-Variablen, die in den SQL-String eingehen, zu entschlüsseln.

SELECT DISTINCT(ip), name, COUNT(name) nameCnt, 
time, price, SUM(price) priceSum
FROM tablename 
WHERE time >= $yesterday AND time <$today 
GROUP BY ip, name

2voto

lexu Punkte 8628

Irgendwie klingt Ihre Anforderung ein wenig widersprüchlich

Gruppe nach Name (das ist im Grunde eine Unterscheidung nach Name plus Bereitschaft zum Aggregieren) und dann eine Unterscheidung nach IP

Was sollte Ihrer Meinung nach geschehen, wenn zwei Personen (Namen) innerhalb des angegebenen Zeitraums von derselben IP aus gearbeitet haben?


Haben Sie das versucht?

SELECT name, COUNT(name), time, price, ip, SUM(price) 
  FROM tablename 
 WHERE time >= $yesterday AND time <$today 
GROUP BY name,ip

2voto

user2463590 Punkte 21

Versuchen Sie das Folgende:

SELECT DISTINCT(ip), name, COUNT(name) nameCnt, 
time, price, SUM(price) priceSum
FROM tablename 
WHERE time >= $yesterday AND time <$today 
GROUP BY ip, name

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X