SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 13.04.2013 20:00:59

cro
Участник
Зарегистрирован: 15.02.2013
Сообщений: 13

Вывод значения двух и более строк SQL в одну ячейку таблицы

Здравствуйте!
Есть запрос SQL и вывод:
http://s24.postimg.org/5ecqz72z9/Capture.png
Вопрос, каким образом вывести значения 'OrderNO' в одну ячейку(не дублируя строки):
http://s14.postimg.org/fjcpbvk0h/Capture2.png

Неактивен

 

#2 13.04.2013 20:43:39

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Вывод значения двух и более строк SQL в одну ячейку таблицы

Можно, если вы хотите получить в ячейке  'OrderNO' текстовое значение.
http://dev.mysql.com/doc/refman/5.5/en/ … oup-concat

Неактивен

 

#3 15.04.2013 14:51:04

cro
Участник
Зарегистрирован: 15.02.2013
Сообщений: 13

Re: Вывод значения двух и более строк SQL в одну ячейку таблицы

Спасибо за функцию.
Есть ощущение что мой запрос составлен не корректно.
В таблице `company` записываются компании у которых может быть несколько `package` у каждой `package` может быть  несколько `price`, `bonus`, `cpanel`
Таблицы:


CREATE TABLE `company`
(
    `id_company`    INT NOT NULL AUTO_INCREMENT,
    `cname`          VARCHAR(50),
    `email`        VARCHAR(50),
    `url`            VARCHAR(200),
    `rating`        MEDIUMINT,
    PRIMARY KEY     (`id_company`)
) ENGINE = InnoDB;

CREATE TABLE `package`
(
    `id_package`     INT NOT NULL AUTO_INCREMENT,
    `pname`        VARCHAR(50),
    `location`        VARCHAR(50),
    `hosttype`        VARCHAR(50),
    `platform`        VARCHAR(50),
    `fk_id_company` INT NOT NULL,
    PRIMARY KEY     (`id_package`),
    FOREIGN KEY     (`fk_id_company`) REFERENCES `company` (`id_company`)
) ENGINE = InnoDB;

CREATE TABLE `price`
(
    `id_price`        INT NOT NULL AUTO_INCREMENT,
    `month`             SMALLINT,
    `price`        DECIMAL(6,2),
    `fk_id_package`  INT NOT NULL,
    PRIMARY KEY     (`id_price`),
    FOREIGN KEY     (`fk_id_package`) REFERENCES `package` (`id_package`)
) ENGINE = InnoDB;

CREATE TABLE `bonus`
(
    `id_bonus`         INT NOT NULL AUTO_INCREMENT,
    `bname`        VARCHAR(50),
    `credit`        MEDIUMINT,
    `fk_id_package`     INT NOT NULL,
    PRIMARY KEY     (`id_bonus`),
    FOREIGN KEY    (`fk_id_package`) REFERENCES `package` (`id_package`)
) ENGINE = InnoDB;

CREATE TABLE `cpanel`
(
    `id_cp`        INT NOT NULL AUTO_INCREMENT,
    `cpname`        VARCHAR(50),
    `fk_id_package`    INT NOT NULL,
    PRIMARY KEY    (`id_cp`),
    FOREIGN KEY    (`fk_id_package`) REFERENCES `package` (`id_package`)
) ENGINE = InnoDB;
 



SELECT    company.cname,
        company.rating,
        package.pname,
        package.location,
        package.hosttype,
        GROUP_CONCAT(DISTINCT cpanel.cpname) AS cpname,
                   GROUP_CONCAT(DISTINCT bonus.credit) AS credit,
                GROUP_CONCAT(DISTINCT price.price) AS price,
                GROUP_CONCAT(DISTINCT price.month) AS month
            FROM `company`, `package`, `cpanel`, `bonus`, `price`
            WHERE company.id_company=package.fk_id_company
            AND package.id_package=cpanel.fk_id_package
                        AND package.id_package=bonus.fk_id_package
                        AND package.id_package=price.fk_id_package
            GROUP BY package.pname
 


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

Неактивен

 

#4 15.04.2013 16:02:41

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Вывод значения двух и более строк SQL в одну ячейку таблицы

FAQ #16

Неактивен

 

#5 15.04.2013 22:38:20

cro
Участник
Зарегистрирован: 15.02.2013
Сообщений: 13

Re: Вывод значения двух и более строк SQL в одну ячейку таблицы

Прочитал, но что-то никак..(

SELECT
company.cname,
company.rating,
package.pname,
package.location,
package.hosttype,
GROUP_CONCAT(cpanel.cpname) AS cpname,
GROUP_CONCAT(bonus.credit) AS credit,
GROUP_CONCAT(price.price) AS price,
GROUP_CONCAT(price.month) AS month
FROM `company`
JOIN(SELECT `pname` FROM `package` GROUP BY `pname`) AS package  
ON company.id_company=package.fk_id_company
JOIN `cpanel`
ON package.id_package=cpanel.fk_id_package
JOIN `price`
ON package.id_package=price.fk_id_package
JOIN `bonus`
ON package.id_package=bonus.fk_id_package

Неактивен

 

#6 17.04.2013 01:58:03

cro
Участник
Зарегистрирован: 15.02.2013
Сообщений: 13

Re: Вывод значения двух и более строк SQL в одну ячейку таблицы

Помогите пожалуйста с запросом

Неактивен

 

#7 17.04.2013 02:47:23

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Вывод значения двух и более строк SQL в одну ячейку таблицы

cro написал:

В таблице `company` записываются компании у которых может быть несколько `package` у каждой `package` может быть  несколько `price`, `bonus`, `cpanel`


С DISTINCT в GROUP_CONCAT получается то что нужно, однако у меня нет дубликатов в этих строках и по идее использовать его не нужно.

Пусть одной записи `package` соответствуют 3 `price` и 4 `bonus`.
Сделав `package` join `price` join `bonus`, вы получите 12 записей. И уже к ним вы применяете группировку, отсюда и дубликаты.

Если у одного package не может быть несколько одинаковых price и т.д., то используйте ваш первый вариант. Иначе, джойнить нужно не таблицы, а подзапросы вида
.. `package` join (select `fk_id_package`,group_concat(`price`) from `price` group by `fk_id_package`)  ...

Неактивен

 

#8 17.04.2013 16:23:23

cro
Участник
Зарегистрирован: 15.02.2013
Сообщений: 13

Re: Вывод значения двух и более строк SQL в одну ячейку таблицы

Какой-то ступор с этими подзапросами, приведите пожалуйста запрос полностью. Сейчас у меня одни дубли -


SELECT *
FROM
`package` join (select `fk_id_package`,group_concat(`price`) from `price` group by `fk_id_package`) AS `price`
 

Неактивен

 

#9 17.04.2013 16:40:47

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Вывод значения двух и более строк SQL в одну ячейку таблицы

Естественно дубли, вы ведь не указали условие объединения.

SELECT *
FROM
`package` join (select `fk_id_package`,group_concat(`price`) AS price from `price` group by `fk_id_package`) AS `price`
 ON package.id_package=price.fk_id_package;

Неактивен

 

#10 18.04.2013 13:23:57

cro
Участник
Зарегистрирован: 15.02.2013
Сообщений: 13

Re: Вывод значения двух и более строк SQL в одну ячейку таблицы

Спасибо. Вы мне очень помогли.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson