MySQL - COUNT auf ganze Tabelle, aber Abfrage mit WHERE

String

Erfahrenes Mitglied
Hey zusammen,

ich poste das gleich mal in PHP, da ich nicht weiß, ob es eine reine MySQL Lösung gibt (welche mit eigentlich am liebsten wäre).

Die Tabelle:
Token, Artnr
a, a1
a, a1
b, a1
b, a2
a, a3

Ich will dem Token a die häufigste eingetragenen Artnr auflisten:
SQL:
SELECT token.token, COUNT(artnr) AS counts FROM token WHERE token.token='a' GROUP BY token.artnr

Jetzt ist die Auflistung natürlich:
a, 2 (für a1)
a, 1 (für a3)

Wie bekomme ich es hin, dass ich zwar nur auf Artnr verwende, die auch Token a haben, aber ein globalen COUNT über die gesamte Tabelle? Sprich:
a, 3 (Da a1 drei mal in der Tabelle steht)
a, 1 (Da a3 nach wie vor nur einmal mit token a verknüpft ist)

Habt ihr da eine Idee?

Danke
paD
 
Zuletzt bearbeitet:
Meinst du sowas?

SQL:
SELECT
	token,
	artnr,
	COUNT(artnr) AS counts
FROM
	token
GROUP BY
	token,
	artnr
WITH ROLLUP

Ergibt
tokenartnrcounts
aa12
aa31
a(NULL)3
ba11
ba21
b(NULL)2
(NULL)(NULL)5
 
Ne, leider nicht.
Denn wenn ich nach WHERE token='a' suche, bekomme ich auch kein COUNT 3 raus.

Mir fällt gerade auf, dass ich das oben nur im Text stehen habe und nicht in der SQL.
Ändere ich sofort.

Also Grob gesagt möchte ich, dass das COUNT die WHERE ignoriert, und ein COUNT für ALLE vorhandenen Zeilen der Artnr macht. Aber nur dann, wenn token A die artnr auch eingetragen hat..

paD
 
Dann ist es aber das was du suchst.
die 3 hast du ja in der 3ten Zeile 'a (NULL) 3' Das ist die Zählung über alle token 'a'.

mit WHERE token='a' bekomme ich das folgende Resultat. Die 2t letzte Zeile ist deine Anzahl über token 'a'
tokenartnrcounts
aa12
aa31
a(NULL)3
(NULL)(NULL)3
 
Hey,

ja / nein das Problem, ich brauche die artnr zwingend. Denn auf die Artnr folgt nachher noch ein left join. Und bei der 3, weiß ich ja leider nicht, welche artnr gemeint ist :(

Wie gesagt, ich befürchte immer mehr, dass das nicht rein in MySQL lösbar ist.

paD
 
Die 3 ist auch keiner artnr zugeteilt. Das kannst du drehen und wenden wie du willst.
Du willst die 3 in einer weiteren Spalte (aber das hast du nirgends geschrieben). Naja, dann dreht man das ganze halt ein wenig

So auf die Schnelle
SQL:
SELECT
	*
FROM
	(
		SELECT
			token,
			artnr,
			counts,
			@token_counts := IF(artnr IS NULL, counts, @token_counts) AS token_counts
		FROM
			(SELECT  @token_counts := 0) AS vars,
			(
				SELECT
					token,
					artnr,
					COUNT(artnr) AS counts
				FROM
					token
				WHERE
					token = 'a'
				GROUP BY
					token,
					artnr
				WITH ROLLUP
			) AS token_counts
		WHERE
			NOT token IS NULL
		ORDER BY
			token, artnr
	) AS my_data
WHERE
	NOT artnr IS NULL;
ergibt
tokenartnrcountstoken_counts
aa123
aa313

Nachtrag:
Oder noch einfacher mit demselbern Resultat
SQL:
SELECT
	a.token,
	a.artnr,
	a.counts,
	b.counts AS token_counts
FROM
	-- Count per token/artnr
	(
		SELECT
			token,
			artnr,
			COUNT(artnr) AS counts
		FROM
			token
		GROUP BY
			token,
			artnr					
	) AS a			
	-- count per token
	INNER JOIN (			
		SELECT
			token,
			COUNT(artnr) AS counts
		FROM
			token
		GROUP BY
			token
	) AS b
		ON a.token = b.token
WHERE
	a.token = 'a';
 
Zuletzt bearbeitet von einem Moderator:
Hey hey, danke mal wieder für deine schnelle Antwort, doch:

Ich glaube wir haben ein wenig an einander vorbei geredet, ich muss nicht wissen, wieviele COUNTs es für DIESEN token gibt, das ist absolut uninteressant.

Du kannst dir das in etwa so vorstellen:
In dieser Tabelle werden alle bearbeiteten Artikel eingetragen (bearbeitet ein Admin den Artikel, kommt ein Eintrag hinzu).
Jetzt will ich eine Auflistung, SORTIERT nach Häufigkeit der Bearbeitung (also von ALLEN Admins) aber nur, wenn der Admin diesen Artikel auch schoneinmal bearbeitet hat.

Also selbst wenn die Tabelle 5000 verschiedene Einträge und davon 300 mal EIN Artikel bearbeitet wurde, der Admin aber nur 2 Artikel bearbeitet hat, sollen nur die beiden Aufgelistet werden, sortiert nach der "globalen" bearbeitungs-menge (count).

Ein zu wünschendes Ergebnis des Beispiels oben wäre:
tokenartnrcounts
aa13
aa31
 
Das 3 ist also nicht die Mange der token a sondern der artnr. OK, macht keinen grossen Unterschied
SQL:
SELECT
	dat.token,
	dat.artnr,
	art.counts
FROM
	(
		SELECT DISTINCT
			token,
			artnr
		FROM
			token
	) AS dat					
	INNER JOIN (			
		SELECT
			artnr,
			COUNT(*) AS counts
		FROM
			token
		GROUP BY
			artnr
	) AS art
		ON dat.artnr = art.artnr
ORDER BY
	dat.token,
	dat.artnr
 
Zuletzt bearbeitet von einem Moderator:
Tausend Dank! Ich könnt dich knutschen :p

Wie auch immer. Ich hab jetzt ne ganze Weile versucht das zu verstehen. Aber solch komplexe Abfragen werd ich mir wohl nie selbst zusammen gebastelt bekommen :D

paD
 
Also die letzte ist einfach

Ich mache 2 Unterabfragen.
1) Alle eindeutigen Schlüssel token/artnr. So dass 'a', 'a1' nur noch einmal vorkommt
SQL:
-- Unterabfrage `dat`
SELECT DISTINCT
    token,
    artnr
FROM
    token
2) Einträge pro artnr zählen
SQL:
-- Unterabfrage `art`
SELECT
    artnr,
    COUNT(*) AS counts
FROM
    token
GROUP BY
    artnr

Anschliessend diese 2 Unterabfragen mit einem JOIN zusammenführen, sortieren - fertig
SQL:
SELECT
    dat.token,
    dat.artnr,
    art.counts
FROM
    `dat`
    INNER JOIN `art`
        ON dat.artnr = art.artnr
ORDER BY
    dat.token,
    dat.artnr
 
Zuletzt bearbeitet von einem Moderator:

Neue Beiträge

Zurück