2016-08-15 2 views
0

У меня эти три таблицы со своими отношениями.Комбинация запросов MySQL из CONCAT, GROUP_CONCAT и 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) 

Отношения по ref_author следующие.

  • comic_id относится к comic_id комикса
  • Оба people_writer_id и people_illust_id относится к people_id людей, так как любые конкретные люди на people_id может быть писателем, иллюстратор, или обоих.
  • Когда есть, например, из двух писателей и один иллюстратора, я бы вставить таблицу с первым писателем и иллюстратором, затем вторым автором и первым иллюстратором (заполняющего разрыв с дубликатом)

Используя этот запрос,

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 

Я мог бы показать этот вид результата.

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 ... 

Проблема с этим запросом, колонка автора будет отображаться красиво, когда один человек только называют одну позицию, но когда один человек называют две позиции, она будет отображаться как дубликаты. Моя цель - отображать данные без дубликатов, таких как это.

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 ... 

Как это сделать? Где я могу изменить запрос или есть ли недостаток в таблице?

+0

UPDATE: Мне удалось выполнить этот подвиг, используя запрос из http://stackoverflow.com/questions/9485901/mysql-concat-ws-without-duplicates, но он отображает только два имени максимум. –

ответ

0

Из того, что я вижу в ваших данных, вы берете значение автора из 2 разных мест, ra.people_writer_id и ra.people_illust_id. Поскольку в вашем представлении эти имена разделены запятой, это означает, что имена отображаются в обоих полях, поэтому, например, Харисма Джати является писателем и иллюстратором.

Если это так, и вы не хотите, имя, чтобы показать два раза, когда они действуют и как писатель и иллюстратор, вам нужно будет изменить этот бит запроса:

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

и использования отличается от обоих полей, и ваш вывод не будет выглядеть, как это делает сейчас .. так, например, вы могли бы сделать

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

Это позволит избежать имен повторы. Однако это будет отображать только уникальные имена между комбинацией этих двух значений, разделенных запятой, и вы не увидите разделения между писателями и иллюстраторами.

+0

Это не то, что я ищу, к сожалению. Результат выглядит точно так же, как я ввел в таблицу ref_author. Например, для комикса с одним писателем и двумя иллюстраторами вывод выглядит как «Pandji PragiwaksonoPandji Pragiwaksono, Pandji PragiwaksonoShani Budi Pandita». –

Смежные вопросы