Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : [mysql] problem mit group by



Cypher
17-08-2007, 12:18
hi,

ich hab in meiner db eine tabelle für bücher, eine für tags die man den büchern über eine tabelle book_tags zuordnen kann.


SELECT tag_name, COUNT(tag_name)
FROM tags INNER JOIN tag_book ON tags.tag_id=tag_book.tag_id INNER JOIN books ON tag_book.book_id=books.book_id
GROUP BY tag_name;
Die Abfrage spuckt mir jetzt alle tags, jeder mit der anzahl an büchern denen er zugeordnet ist, aus.
soweit ist das auch gut, aber ich würde mir gerne aus der liste jetzt noch die tags herausfiltern, die einem bestimmten buch zugeordnet sind.
ich hab es mit folgender abfrage probiert:

ELECT tag_name, COUNT(tag_name)
FROM tags INNER JOIN tag_book ON tags.tag_id=tag_book.tag_id INNER JOIN books ON tag_book.book_id=books.book_id
WHERE books.book_id=2
GROUP BY tag_name;
aber dann bringt er mir für die jeweilige anzahl von zuweisungen (eigendlich logischerweise) immer 1.

weiß jemand eine lösung für das problem?


thx, cypher

jan61
18-08-2007, 00:31
Für welches Problem denn? Es ist (wie Du ja schon schreibst) völlig logisch, dass da immer eine 1 kommt - die Tag-Namen für 1 Buch sind doch eindeutig, oder? Wenn Du wissen willst, wieviele Tags insgesamt für ein Buch existieren, dann darf natürlich der Tag-Name in der Abfrage nicht mehr auftauchen (er ist ja eindeutig), Du musst 2 separate Abfragen oder einen umfunktionierten Join benutzen (ungetestet):
-- Variante 1: 2 Abfragen
-- 1. Abfrage: die Tags
SELECT tag_name
FROM tags INNER JOIN tag_book ON tags.tag_id=tag_book.tag_id INNER JOIN books ON tag_book.book_id=books.book_id
WHERE books.book_id=2;
-- 2. Abfrage: Die Anzahl
SELECT count(tag_id)
FROM tag_book INNER JOIN books ON tag_book.book_id=books.book_id
WHERE books.book_id=2;
-- Union
SELECT tag_name, 1 anzahl
FROM tags INNER JOIN tag_book ON tags.tag_id=tag_book.tag_id INNER JOIN books ON tag_book.book_id=books.book_id
WHERE books.book_id=2
union
SELECT 'Gesamt' tag_name, count(tag_id)
FROM tag_book INNER JOIN books ON tag_book.book_id=books.book_id
WHERE books.book_id=2
group by tag_name;
Jan

Cypher
20-08-2007, 12:12
danke, habe es jetzt mit zwei seperaten abfragen gemacht.