2016-08-15 1 views
0

Ich habe diese drei Tabellen mit ihren Beziehungen.MySQL Abfrage Kombination von CONCAT, GROUP_CONCAT und DISTINCT

people 
    people_id   (int) 
    people_name  (varchar) 

comic 
    comic_id   (int) 
    comic_name   (varchar) 

ref_author 
    comic_id   (int) 
    people_writer_id (int) 
    people_illust_id (int) 

Die Beziehungen auf ref_author sind wie folgt.

  • comic_id bezieht sich auf comic_id Comic
  • Beide people_writer_id und people_illust_id bezieht sich auf person_id Menschen, als irgendwelche besonderen Menschen auf person_id ein Schriftsteller, Illustrator sein könnte, oder beides.
  • Wenn es, beispielsweise aus zwei Autoren und einen Illustrator, würde ich die Tabelle mit dem ersten Schriftsteller und Illustrator einfügen, dann dem zweiten Autor und den ersten Illustrator (die Lücke mit doppelter Füllung)

Mit dieser Abfrage

SELECT distinct SQL_CALC_FOUND_ROWS 
    c.comic_name, concat (group_CONCAT(distinct pa.people_name separator '/'), ', ', group_CONCAT(distinct pb.people_name separator '/')) as 'author' 
FROM ref_author ra 
inner join comic c on c.comic_id = ra.comic_id 
inner join people pa on pa.people_id = ra.people_writer_id 
inner join people pb on pb.people_id = ra.people_illust_id 
group by c.comic_name 

ich könnte diese Art von Ergebnis angezeigt werden soll.

comic_name   author 
17+    Kharisma Jati, Kharisma Jati 
1SR6    Muhammad Fathanatul Haq, Muhammad Fathanatul Haq 
304th Study Room Felicia Huang, Felicia Huang 
4HERO    Arief Prasojo, Arief Prasojo 
5 cm    Donny Dhirgantoro, Is Yuniarto 
.... 
Degalings   Pandji Pragiwaksono, Pandji Pragiwaksono/Shani ... 

Das Problem bei dieser Abfrage wird der Autor Spalte schön an, wenn nur ein Volk auf eine Position bezeichnet, aber wenn man die Menschen in zwei Positionen bezeichnet, wird sie als Duplikate angezeigt werden soll. Mein Ziel ist es, die Daten ohne solche Duplikate anzuzeigen.

comic_name   author 
17+    Kharisma Jati 
1SR6    Muhammad Fathanatul Haq 
304th Study Room Felicia Huang 
4HERO    Arief Prasojo 
5 cm    Donny Dhirgantoro, Is Yuniarto 
.... 
Degalings   Pandji Pragiwaksono, Shani ... 

Wie mache ich das? Wo ändere ich die Abfrage oder gibt es einen Fehler in der Tabelle?

+0

UPDATE: Ich habe es geschafft, dieses Kunststück mit der Abfrage von http://stackoverflow.com/questions/9485901/mysql-concat-ws-outout-duplicates zu erreichen, aber es zeigt maximal zwei Namen an. –

Antwort

0

Von was ich in Ihren Daten sehen kann, nehmen Sie den Autor Wert von 2 verschiedenen Orten, ra.people_writer_id und ra.people_illust_id. Da in Ihrer Ausgabe diese Namen durch ein Komma getrennt sind, bedeutet dies, dass die Namen in beiden Feldern erscheinen, so dass Kharisma Jati zum Beispiel sowohl ein Autor als auch ein Illustrator ist.

Wenn dies der Fall ist, und Sie nicht wollen, einen Namen zweimal zu zeigen, wenn sie sowohl als Schriftsteller und Illustrator handeln, müßten Sie dieses Bit Ihrer Abfrage ändern:

concat (group_CONCAT(distinct pa.people_name separator '/'), ', ', group_CONCAT(distinct pb.people_name separator '/')) as 'author' 

und Verwendung verschieden zwischen beiden der Felder, und Ihrem Ausgang würde nicht aussehen wie jetzt .. so zum Beispiel, Sie Diese

group_CONCAT(distinct pa.people_name,pb.people_name separator ' , ') as 'author' 

vermeiden Namen Wiederholungen tun könnten. Dies wird jedoch nur die eindeutigen Namen zwischen der Kombination dieser beiden durch Komma getrennten Werte aufführen, und Sie würden die Trennung zwischen Writern und Illustratoren nicht sehen.

+0

Das suche ich leider nicht. Die Ausgabe sieht genau so aus, wie ich sie in die Tabelle ref_author eingegeben habe. Bei einem Comic mit einem Autor und zwei Illustratoren zum Beispiel sieht die Ausgabe so aus: "Pandji PragiwaksonoPandji Pragiwaksono, Pandji PragiwaksonoShani Budi Pandita". –