MySQL возвращает несколько строк в одном столбце - PullRequest
1 голос
/ 04 октября 2011

У меня есть этот запрос:

SELECT 
    s.id AS id, 
    s.item_id, 
    i.type_id AS type_id, 
    i.description AS description, 
    i.owner_id, 
    s.buyer_id, 
    i.receivedate, 
    i.statusdate, 
    i.baseprice, 
    i.salepercentage, 
    i.status_id, 
    s.posteddate, 
    s.closingdate, 
    s.discountdate, 
    s.discountrate, 
    t.description AS type_description, 
    st.description AS status_description
FROM 
    sale s
LEFT JOIN item i ON s.item_id=i.id 
LEFT JOIN TYPE t ON i.type_id=t.id 
LEFT JOIN STATUS st ON i.status_id=st.id 
WHERE s.flag_id != 2
GROUP BY s.id
ORDER BY s.closingdate;

Работает нормально, но в качестве последнего шага мне нужно получить объединенные поля имени и фамилии из еще одной таблицы с именем customer для , оба поля i.owner_id и s.buyer_id.

Я подошел ближе, используя следующее:

SELECT 
    s.id AS id, 
    s.item_id, 
    i.type_id AS type_id, 
    i.description AS description, 
    i.owner_id, 
    s.buyer_id, 
    i.receivedate, 
    i.statusdate, 
    i.baseprice, 
    i.salepercentage, 
    i.status_id, 
    s.posteddate, 
    s.closingdate, 
    s.discountdate, 
    s.discountrate, 
    t.description AS type_description, 
    st.description AS status_description, 
    GROUP_CONCAT(CONCAT(c.firstname, ' ', c.lastname) ORDER BY i.owner_id, s.buyer_id)
FROM 
    sale s 
LEFT JOIN item i ON s.item_id=i.id 
LEFT JOIN TYPE t ON i.type_id=t.id 
LEFT JOIN STATUS st ON i.status_id=st.id 
LEFT JOIN CUSTOMER c ON i.owner_id=c.id OR s.buyer_id=c.id
WHERE s.flag_id != 2
GROUP BY s.id
ORDER BY s.closingdate;

Когда я проверяю его, используя записи в таблице клиентов, как показано ниже:

id=3, firstname="John", lastname="Doe"
id=10, firstname="Jane", lastname="Do"

И предметы из таблицы продажи имеют:

owner_id=3, buyer_id=10
owner_id=10, buyer_id=3

Столбец GROUP_CONCAT() возвращает

Jane Do,John Doe
Jane Do,John Doe

У меня нет возможности узнать, кто является владельцем, а кто - покупателем, только с позиции, разделенной запятыми, поскольку результаты, на которые я надеялся, были

John Doe,Jane Do
Jane Do,John Doe

для продажи предметов.

Можно ли гарантировать, что возвращенный набор результатов будет иметь список GROUP_CONCAT(), возвращенный в контролируемом заказе (т. Е. Первый клиент будет связан с owner_id, а второй клиент - с buyer_id)?

Ответы [ 2 ]

3 голосов
/ 04 октября 2011

Я бы предложил присоединиться к таблице клиентов дважды.один раз для покупателя, один раз для владельца:

SELECT ...
   GROUP_CONCAT(CONCAT(buyer.firstname, ' ', buyer.lastname) AS buyers,
   GROUP_CONCAT(CONCAT(owner.firstname, ' ', owner.lastname) AS owners
...
LEFT JOIN customer AS buyer ON s.buyer_id=buyer.id
LEFT JOIN customer AS owner ON i.owner_id=owner.id

Если вам необходимо хранить данные отдельно, то храните их отдельно.

1 голос
/ 04 октября 2011

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

SELECT 
  s.id AS id, s.item_id
  , i.type_id AS type_id, i.description AS description, i.owner_id
  , s.buyer_id
  , i.receivedate, i.statusdate, i.baseprice, i.salepercentage, i.status_id
  , s.posteddate, s.closingdate, s.discountdate, s.discountrate
  , t.description AS type_description
  , st.description AS status_description
  , GROUP_CONCAT(
      CONCAT(co.firstname, ' ', co.lastname,',',cb.firstname,' ',cb.lastname) 
      ORDER BY co.id,cb.id) as first_owner_than_buyer
FROM sale s 
LEFT JOIN item i ON s.item_id=i.id 
LEFT JOIN TYPE t ON i.type_id=t.id 
LEFT JOIN STATUS st ON i.status_id=st.id 
LEFT JOIN CUSTOMER co ON (i.owner_id=co.id)
LEFT JOIN CUSTOMER cb ON (s.buyer_id=cb.id)
WHERE s.flag_id != 2
GROUP BY s.id
ORDER BY s.closingdate;
...