php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > SQL / Datenbanken
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


SQL / Datenbanken Probleme mit SQL? Hier könnt ihr eure Fragen zu SQL (MySQL, PostgreSQL, MS-SQL und andere ANSI-SQL Server) los werden.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 23-03-2010, 18:10
boxi123
 Registrierter Benutzer
Links : Onlinestatus : boxi123 ist offline
Registriert seit: Jan 2008
Beiträge: 20
boxi123 ist zur Zeit noch ein unbeschriebenes Blatt
Standard Abfrage mit GROUP_CONCAT und GROUP BY mag micht nicht.

Hallo,

ich komme mit einer mySQL-Abfrage nicht weiter, vielleicht könnt ihr mir einen Tipp geben, was ich falsch mache.

Aufgabe: ich sammle Musik-Gruppen aus einer Tabelle und die jeweils dazu hinterlegten Musik-Genres aus einer zweiten Tabelle. Die einzelnen Genres jeder Band werden durch das GROUP_CONCAT als Komma separierte Liste angezeigt.

Ausgabe:
http://vampster.com/genres/example_genres3.php

Die dazugehörige Abfrage:
Code:
SELECT name, band_id, tag, naehe,GROUP_CONCAT(tag ORDER BY tag)
FROM bands_tags LEFT JOIN bands_master ON bands_tags.band_id = id 
GROUP BY name ORDER BY name ASC,naehe DESC
(Bezeichnungen:
name: Bandname
band_id: Band ID
tag: Genre-Bezeichnung
naehe: Gewichtung -> 10 = niedrige Übereinstimmung von Band zu Genre, 100 = hohe Übereinstimmung.

aus der tabelle bands_master und dem LEFT JOIN hole ich den bandnamen passend zur band_id.)


Nun möchte ich aber gerne nach den Genres Filtern. Mein Ansatz geht leider nicht:

2. Abfrage:


PHP-Code:
if (isset($genre)) {
$query "SELECT name, band_id, tag, naehe,GROUP_CONCAT(tag ORDER BY tag) 
FROM bands_tags LEFT JOIN bands_master ON bands_tags.band_id = id 
WHERE tag =\""
.$genre."\" GROUP BY name 
ORDER BY name ASC,naehe DESC;"
;

Ausgabe (Beispiel):
http://vampster.com/genres/example_g...rnative%20rock

Es wird also nur das eine Genre angezeigt, nach dem ich in der URL filtere. Mein Ziel wäre, auch die anderen Genres angezeigt zu bekommen, wenn zur Band weitere Einträge vorhanden sind.

Kann mir jemand helfen?

Vielen Dank schonmal,
Markus

PS: Der Server läuft noch mit mySQL 4.1.25, falls das wichtig ist.

Geändert von boxi123 (23-03-2010 um 23:04 Uhr) Grund: Code Tags + Erläuterungen hinzugefügt
Mit Zitat antworten
  #2 (permalink)  
Alt 23-03-2010, 18:17
ronronron3005
 Registrierter Benutzer
Links : Onlinestatus : ronronron3005 ist offline
Registriert seit: Feb 2010
Ort: Hohenstein-Ernstthal
Beiträge: 48
ronronron3005 zeigte ein beschämendes Verhalten in der Vergangenheit
Standard

Zitat:
Zitat von boxi123 Beitrag anzeigen
WHERE tag =\"".$genre."\" group by name
Wenn ich das so lese, kann das ja auch nicht wirklich gehen. Du sagst ja der DB das er nur die Datensätze haben soll, welche dieses Tag beinhalten. woher soll die DB denn wissen das du dennoch mehr willst. Oder habe ich deinen Post falsch interpretiert ?
__________________
Wozu brauchen wir Kraftwerke, wenn der Strom aus der Steckdose kommt.

Geändert von ronronron3005 (23-03-2010 um 18:20 Uhr) Grund: Deutsche Sprache, schwere Sprache
Mit Zitat antworten
  #3 (permalink)  
Alt 23-03-2010, 18:28
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

Hallo,

kannst du bitte den Code mit den entsprechenden Tags formatieren und die benutzten Tabellen- und Spaltennamen erläutern? Dann kann man dir gezielter helfen.

Gruß,

Amica
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt?
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke!
Mit Zitat antworten
  #4 (permalink)  
Alt 23-03-2010, 18:46
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

Dreh mal dein Error Reporting auf. Das hier ist nämlich Käse:
PHP-Code:
$genre $_GET["genre"];
if (isset(
$genre)) {
    
// ...

Mit Zitat antworten
  #5 (permalink)  
Alt 23-03-2010, 23:13
boxi123
 Registrierter Benutzer
Links : Onlinestatus : boxi123 ist offline
Registriert seit: Jan 2008
Beiträge: 20
boxi123 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Zitat von ronronron3005 Beitrag anzeigen
Wenn ich das so lese, kann das ja auch nicht wirklich gehen. Du sagst ja der DB das er nur die Datensätze haben soll, welche dieses Tag beinhalten. woher soll die DB denn wissen das du dennoch mehr willst. Oder habe ich deinen Post falsch interpretiert ?
ich bin davon ausgegangen, dass ich das mit dem
Code:
GROUP_CONCAT(tag ORDER BY tag)
erreiche. Der Gedanke war, suche alle Eintrage, die das Genre "$genre" beeinhalten und zeige dann noch die weiteren Genres zu dieser Band. Habe das GROUP_CONCAT bisher noch nie verwendet, verwende ich es falsch?
Mit Zitat antworten
  #6 (permalink)  
Alt 23-03-2010, 23:14
boxi123
 Registrierter Benutzer
Links : Onlinestatus : boxi123 ist offline
Registriert seit: Jan 2008
Beiträge: 20
boxi123 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Zitat von AmicaNoctis Beitrag anzeigen
Hallo,

kannst du bitte den Code mit den entsprechenden Tags formatieren und die benutzten Tabellen- und Spaltennamen erläutern? Dann kann man dir gezielter helfen.

Gruß,

Amica

Ok, so?

Gruß,
Markus
Mit Zitat antworten
  #7 (permalink)  
Alt 23-03-2010, 23:20
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

Zitat:
Zitat von boxi123 Beitrag anzeigen
Ok, so?
Jep, danke.

Da musst du wohl nochmal auf bands_tags joinen, also einmal bands_tags verwenden, um das Ergebnis einzugrenzen, darüber auf die Bands joinen und von dort nochmal auf bands_tags (mit Alias), um darauf das group_concat anzuwenden.

Wenn du nur einmal bands_tags verwendest, wird es durch die Where-Klausel beschränkt, wie /(ron)+3005/ schon sagte.

Gruß,

Amica
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt?
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke!
Mit Zitat antworten
  #8 (permalink)  
Alt 23-03-2010, 23:24
boxi123
 Registrierter Benutzer
Links : Onlinestatus : boxi123 ist offline
Registriert seit: Jan 2008
Beiträge: 20
boxi123 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Danke schön! Werde das morgen früh mal ausprobieren.
Dann mal schauen, ob ich es kapiert habe

Gruß,
Markus
Mit Zitat antworten
  #9 (permalink)  
Alt 24-03-2010, 12:42
boxi123
 Registrierter Benutzer
Links : Onlinestatus : boxi123 ist offline
Registriert seit: Jan 2008
Beiträge: 20
boxi123 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Hallo Amica,

ich muss nochmal nachfragen, weil ich nicht weiter komme: Die WHERE-Klausel fliegt raus, und dafür kommt ein zweiter JOIN rein, der die zusätzlichen Genres abfragt?
Steh wohl auf dem Schlauch.

Danke & Gruß,
Markus
Mit Zitat antworten
  #10 (permalink)  
Alt 24-03-2010, 12:46
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

Nein, die Where-Klausel bleibt und filtert immer noch das Genre raus, nach dem gesucht werden soll. Sonst würde das ja an der Aufgabenstellung vorbei gehen.

Hier mal ein Beispiel:

Code:
select
    person.first_name,
    person.last_name,
    phone2.country_code,
    phone2.area_code,
    phone2.number,
    phone2.extension
from phone as phone1
join person on person.id = phone1.person_id
join phone as phone2 on phone2.person_id = person.id
where phone1.country_code = 49
    and phone1.area_code  = 172
    and phone1.number     = 1234567
    and phone1.extension is null
Findet alle Telefonnummern der Person, welche auch die Telefonnummer +49 172 1234567 besitzt. Über phone1 wird nur gefiltert und die Person rausgesucht. Die Telefonnummern im Ergebnis stammen dagegen aus phone2.
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt?
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke!

Geändert von AmicaNoctis (24-03-2010 um 12:57 Uhr)
Mit Zitat antworten
  #11 (permalink)  
Alt 24-03-2010, 12:59
boxi123
 Registrierter Benutzer
Links : Onlinestatus : boxi123 ist offline
Registriert seit: Jan 2008
Beiträge: 20
boxi123 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Zitat von AmicaNoctis Beitrag anzeigen
Nein, die Where-Klausel bleibt und filtert immer noch das Genre raus, nach dem gesucht werden soll. Sonst würde das ja an der Aufgabenstellung vorbei gehen.
Okay, danke, probier ich so nochmal - und sorry für meine vielleicht 'dummen' Fragen. Ich kratze programmiertechnisch noch ziemlich an der Oberfläche und versuche, so gut ich eben kann, solche Dinge selbst zu programmieren. Aber an dem Punkt komm ich gerade alleine einfach nicht weiter.

Gruß,
Markus

Geändert von boxi123 (24-03-2010 um 13:00 Uhr) Grund: ah, danke für das Beispiel!
Mit Zitat antworten
  #12 (permalink)  
Alt 24-03-2010, 13:33
boxi123
 Registrierter Benutzer
Links : Onlinestatus : boxi123 ist offline
Registriert seit: Jan 2008
Beiträge: 20
boxi123 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

so wie ich es verstanden habe, sollte die Abfrage etwa so aussehen?

Code:
SELECT name, band_id, tag, naehe,alle_genres.tag, GROUP_CONCAT(tag order by tag) FROM bands_tags

JOIN bands_master ON bands_tags.band_id = id 
JOIN bands_tags AS alle_genres ON alle_genres.tag = bands_tags.tag

where tag = "alternative rock"
group by name 
ORDER BY name ASC,naehe DESC
Fehlermeldung: "#1052 - Column 'band_id' in field list is ambiguous".

Wieso ist die Band ID jetzt mehrdeutig?
Mit Zitat antworten
  #13 (permalink)  
Alt 24-03-2010, 13:42
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

Zitat:
Zitat von boxi123 Beitrag anzeigen
Wieso ist die Band ID jetzt mehrdeutig?
Na weil sie einmal aus bands_tags und einmal aus alle_genres kommen kann. Benutz doch einfach qualifizierende Spaltenreferenzen wie in meinem Beispiel (schreib den Tabellennamen/Alias davor).
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt?
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke!
Mit Zitat antworten
  #14 (permalink)  
Alt 24-03-2010, 14:04
boxi123
 Registrierter Benutzer
Links : Onlinestatus : boxi123 ist offline
Registriert seit: Jan 2008
Beiträge: 20
boxi123 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Zitat von AmicaNoctis Beitrag anzeigen
Na weil sie einmal aus bands_tags und einmal aus alle_genres kommen kann. Benutz doch einfach qualifizierende Spaltenreferenzen wie in meinem Beispiel (schreib den Tabellennamen/Alias davor).

jep, okay. die abfrage geht jetzt prinzipiell, ist aber noch falsch.

Code:
SELECT bands_master.name, bands_tags.band_id, bands_tags.tag, bands_tags.naehe, alle_genres.tag, GROUP_CONCAT( bands_tags.tag
ORDER BY bands_tags.tag ) 
FROM bands_tags
JOIN bands_master ON bands_tags.band_id = bands_master.id
JOIN bands_tags AS alle_genres ON alle_genres.tag = bands_tags.tag
WHERE bands_tags.tag = "modern metal"
GROUP BY name
ORDER BY name ASC , naehe DESC
Ausgabe am Beispiel "Modern Metal":
http://vampster.com/genres/example_g...modern%20metal

Diesem Genre wurden erst fünf Bands zugeordnet. In der Ausgabe erhalte ich fünf mal den Begriff "modern metal" aufgezählt. Dann ist der zweite JOIN vermutlich noch falsch?

Ich glaube, das ist mir alles doch eine Nummer zu hoch.
Mit Zitat antworten
  #15 (permalink)  
Alt 24-03-2010, 14:34
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

Du brauchst nur bands_tags.* im Select-Teil wegzulassen. Und im group_concat musst du natürlich alle_genres verwenden.
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt?
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke!

Geändert von AmicaNoctis (24-03-2010 um 14:43 Uhr)
Mit Zitat antworten
Antwort

Lesezeichen

Stichworte
group by, group_concat, sql


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Abfrage über mehrere DB'S (join) + group + zählen evil_knievel SQL / Datenbanken 2 02-09-2008 10:28
[SQL allgemein] Abfrage mit GROUP BY mapro SQL / Datenbanken 1 22-07-2007 19:28
email betreff micht lesbar jogisarge PHP Developer Forum 4 23-08-2006 14:14
GROUP_CONCAT mit Int strauberry SQL / Datenbanken 0 02-02-2006 11:12
count und group by für blätterfunktion funktioniert nicht westberlin SQL / Datenbanken 6 08-11-2003 13:40

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 05:22 Uhr.