WulfmanGER
Commander
- Registriert
- Juli 2005
- Beiträge
- 2.346
Hallo zusammen,
ich hab leider mehrere unglücklich erstellte Tabellen (nicht von mir -> ich importiere nur 1:1 von sqllite [calibre] zu mySQL) wo ich an einer Abfrage festhänge.
Mein "Basis"-Query sieht so aus:
Ergebnis:
Ja die Abfrage greift auch auf nicht dargestellte Tabellen/Felder (*tags*) zu - das muss ich machen um von einem Schlagwort die Buchinformationen zu erhalten.
Das Ziel der Abfrage sollte aber eigentlich sein:
Ich bekomme alle Bücher angezeigt die mit dem Schlagwort/Tag "248" belegt sind. Exakt das macht die Abfrage. Aber das reicht mir so nicht. Bücher der gleichen Serie, sollen mit dem Seriennamen respräsentiert werden - Serienlose Bücher, mit ihrem Buchtitel.
ABER ... ich nutze das Quelltool für die Verwaltung und da ist es in meinem Fall von Vorteil JEDEM Buch eine Serie zuordnen. Serienlose-Bücher bekommen aber eine FAKE-Serie:
Im TOOL sieht das so aus:
Buch 5 -> Serie: Beletristik
Buch 1 -> Serie: Beletristik.Tolle Romane über Tiefseefische
Buch 6 -> Serie: Comic
Buch 123 -> Serie: Comic.Walt Disneys Best-off
Hier kann ich dann auf Comic klicken und bekomme alle Comics unter "Comic" und unter "Comic." angezeigt. Das will ich DORT auch so haben. In meinem mySQL-PHP-Version wird das leider zu einem logistischen Problem... wie ich gerade merke ...
Kurz: ich suche eine Abfrage die Quasi bei existierenden Seriennamen auf eben diesen Gruppiert, bei fehlenden Seriennamen DIESEN in Serienname reinschreibt (damit ich bei der php-Abfrage nicht ständig 2 spalten switchen muss)
Das WUNSCH-Ergebnis wäre also:
222, 249 sind besagte Fake-Serien (gibt es mehrere von)
Ich hab es schon mit CONCAT versucht - aber das fügt halt title und serienname zusammen - gut wenn kein Serienname da ist, sonst schlecht
COALESCE = "zweites" überschreibt "erstes"
CONCAT_WS hilft auch nicht.
Mit having nach dem Group bekomme ich nur entweder oder ANGEZEIGT. having series = 222 -> nur Bücher der Fakeserie 222 werden angezeigt. Mit != alles außer diese werden Gruppiert ...
Bin kurz davor die Gesamtmasse in eine Temporäre Tabelle zu schreiben und diese mittels php erstmal formen und dann auslesen. Aber das jetzt nicht gerade positiv für die Systemlast
Man könnte wohl mit IF, CASE in mySQL arbeiten - da blicke ich aber noch nicht so recht durch
Wenn "Serienname" = LEER dann füge title in serienname ein :=) ... das ganze per Group by von duplikaten befreien - fertig. Aber wie?
Neben mySQL wird php zum Auslesen genutzt.
Danke schon mal
ich hab leider mehrere unglücklich erstellte Tabellen (nicht von mir -> ich importiere nur 1:1 von sqllite [calibre] zu mySQL) wo ich an einer Abfrage festhänge.
Mein "Basis"-Query sieht so aus:
Code:
select btl.book, b.title, bsl.series, s.edit
from books_tags_link btl, books b, books_series_link bsl
left join series s on s.id=bsl.series
where btl.book = b.id and btl.tag = 248 AND bsl.book=b.id
Ergebnis:
Code:
book(id) | title | series(id) | serienname
1 | Buch 1 | 1 | Tolle Romane über Tiefseefische
2 | Buch 2 | 1 | Tolle Romane über Tiefseefische
3 | Buch 3 | 1 | Tolle Romane über Tiefseefische
4 | Buch 4 | 1 | Tolle Romane über Tiefseefische
5 | Buch 5 | 222 |
6 | Buch 6 | 249 |
7 | Buch 7 | 2 | Storys aus dem Leben einer Kualquappe
8 | Buch 8 | 2 | Storys aus dem Leben einer Kualquappe
9 | Buch 9 | 222 |
10 | Buch 10 | 222 |
11 | Buch 11 | 249 |
Das Ziel der Abfrage sollte aber eigentlich sein:
Ich bekomme alle Bücher angezeigt die mit dem Schlagwort/Tag "248" belegt sind. Exakt das macht die Abfrage. Aber das reicht mir so nicht. Bücher der gleichen Serie, sollen mit dem Seriennamen respräsentiert werden - Serienlose Bücher, mit ihrem Buchtitel.
ABER ... ich nutze das Quelltool für die Verwaltung und da ist es in meinem Fall von Vorteil JEDEM Buch eine Serie zuordnen. Serienlose-Bücher bekommen aber eine FAKE-Serie:
Im TOOL sieht das so aus:
Buch 5 -> Serie: Beletristik
Buch 1 -> Serie: Beletristik.Tolle Romane über Tiefseefische
Buch 6 -> Serie: Comic
Buch 123 -> Serie: Comic.Walt Disneys Best-off
Hier kann ich dann auf Comic klicken und bekomme alle Comics unter "Comic" und unter "Comic." angezeigt. Das will ich DORT auch so haben. In meinem mySQL-PHP-Version wird das leider zu einem logistischen Problem... wie ich gerade merke ...
Kurz: ich suche eine Abfrage die Quasi bei existierenden Seriennamen auf eben diesen Gruppiert, bei fehlenden Seriennamen DIESEN in Serienname reinschreibt (damit ich bei der php-Abfrage nicht ständig 2 spalten switchen muss)
Das WUNSCH-Ergebnis wäre also:
Code:
book(id) | title | series(id) | serienname
1 | Buch 1 | 1 | Tolle Romane über Tiefseefische
5 | Buch 5 | 222 | Buch 5
6 | Buch 6 | 249 | Buch 6
7 | Buch 7 | 2 | Storys aus dem Leben einer Kualquappe
9 | Buch 9 | 222 | Buch 9
10 | Buch 10 | 222 | Buch 10
11 | Buch 11 | 249 | Buch 11
Ich hab es schon mit CONCAT versucht - aber das fügt halt title und serienname zusammen - gut wenn kein Serienname da ist, sonst schlecht

Code:
select btl.book, b.title, bsl.series, s.edit, CONCAT(b.title, s.edit) as bla
...
group by bla
COALESCE = "zweites" überschreibt "erstes"
Code:
select btl.book, b.title, bsl.series, s.edit, COALESCE(b.title, s.edit) btse
...
group by bla
Mit having nach dem Group bekomme ich nur entweder oder ANGEZEIGT. having series = 222 -> nur Bücher der Fakeserie 222 werden angezeigt. Mit != alles außer diese werden Gruppiert ...
Bin kurz davor die Gesamtmasse in eine Temporäre Tabelle zu schreiben und diese mittels php erstmal formen und dann auslesen. Aber das jetzt nicht gerade positiv für die Systemlast

Man könnte wohl mit IF, CASE in mySQL arbeiten - da blicke ich aber noch nicht so recht durch

Neben mySQL wird php zum Auslesen genutzt.
Danke schon mal
