MySQL объединяет 3 таблицы и форматирует - PullRequest
0 голосов
/ 23 февраля 2012

Я использую codeigniter и пытаюсь вызвать 3 разные таблицы и объединить их в один массив.Вот что у меня есть:

$this->db->select('so_alcohol.id, 
    so_alcohol.name as name, 
    so_alcohol.category as category, 
    so_alcohol.permName as permName,
    so_alcohol.picture as alcoholPicture, 
    group_concat(so_user.firstName) as firstName,
    group_concat(so_user.lastName) as lastName,
    group_concat(so_user.picture) as userPicture,
    group_concat(so_rating.idUser) as idUser,
    group_concat(so_rating.overall) as overall,
    group_concat(so_rating.description) as description');
$this->db->from('alcohol');
$this->db->order_by("id", "desc"); 
$this->db->join('so_rating', 'so_rating.idAlcohol = so_alcohol.id', 'LEFT');
$this->db->join('so_user', 'so_user.id = so_rating.idUser', 'LEFT');
$query = $this->db->get();

Вывод, который я хотел бы получить, следующий:

Array
(
    [0] => stdClass Object
            (
                    [id] => 1
                    [name] => Product Name
                    [category] => Product category
                    [permName] => Product-Name
                    [alcoholPicture] => http://image.com/1.jpg
                    [idUser] => 1,2,3
                    [overall] => 100,80,50
                    [description] => Review 1,Awesome review 2, Horrible review 3
                    [firstName] => name 1, name 2, name 3
                    [lastName] => last 1, last 2, last 3
                    [userPicture] => http://userimage.com/1.jpg, http://userimage.com/2.jpg, http://userimage.com/3.jpg
                )
    [0] => stdClass Object
            (
                    [id] => 1
                    [name] => Product Name
                    [category] => Product category
                    [permName] => Product-Name
                    [alcoholPicture] => http://image.com/1.jpg
                    [idUser] => 1,2,3
                    [overall] => 100,80,50
                    [description] => Review 1,Awesome review 2, Horrible review 3
                    [firstName] => name 1, name 2, name 3
                    [lastName] => last 1, last 2, last 3
                    [userPicture] => http://userimage.com/1.jpg, http://userimage.com/2.jpg, http://userimage.com/3.jpg
                )  

)

Мой вопрос: как мне сделать то, что у меня работает, сейчас есть двапроблемы (которые я нашел) Во-первых, он выводит только 1 результат, мне нужно вывести 40, а во-вторых, я не могу so_user.id = so_rating.idUser, потому что я уже group_concat(so_rating.idUser) Есть идеи?Я даже не уверен, что это правильный способ сделать это, так как я все еще новичок в php.

РЕДАКТИРОВАТЬ:

Алкоголь

id        name           category        permName        picture
1         Product #1     1               Product-1       http://someurl.com/1.jpg
2         Product #2     1               Product-2       http://someurl.com/2.jpg
3         Product #3     1               Product-2       http://someurl.com/3.jpg
4         Product #4     2               Product-2       http://someurl.com/4.jpg

Рейтинг

id        idUser        idProduct        overall        description
1         1             2                100            Great Product Review 1
2         2             2                75             Great Product Review 2      
3         1             3                100            Great Product Review 3     
4         2             3                98             Great Product Review 4

Пользователь

id        firstName        lastName        userPicture  
1         first 1          last 1          http://someurlUserPicture.com/1.jpg            
2         first 2          last 2          http://someurlUserPicture.com/2.jpg                 
3         first 3          last 3          http://someurlUserPicture.com/3.jpg                
4         first 4          last 4          http://someurlUserPicture.com/4.jpg

1 Ответ

2 голосов
/ 23 февраля 2012

Можете ли вы предоставить некоторые схемы таблиц для работы? я также не вижу GROUP BY в вашем запросе. я предполагаю, что вы хотите GROUP BY so_alcohol.id? если вы хотите сгруппировать только по so_alcohol.id, вам придется использовать функцию агрегирования в оставшихся столбцах, например max(so_alcohol.name) as name. дальнейшее чтение о max ()

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

SELECT
    MAX(customer.email) AS email,
    MAX(customer.name) AS name,
    GROUP_CONCAT(address.country) AS countries
FROM
    customer
JOIN
    /* customer.address_id is not in the SELECT-clause, 
       but you can still use the column to join */
    address ON customer.address_id = address.id 
GROUP BY
    customer.id

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

Edit1: пример для GROUP BY

ТАБЛИЦА ПРОДУКТОВ

id   name
1    Product1
2    Product2

ТАБЛИЦА рейтингов

rating_id   product_id
1           1
2           1
3           2

Регистрация

SELECT * 
FROM product 
JOIN rating ON product.id = rating.product_id

выходы

id   name        rating_id   product_id
1    Product1    1           1
1    Product1    2           1
2    Product2    3           2

добавление GROUP BY id -clause

SELECT 
    id,
    MAX(name) AS name,
    COUNT(rating_id) AS rating_count
FROM product 
JOIN rating ON product.id = rating.product_id
GROUP BY id

объединит все кортежи с одинаковым значением в столбце id в одну группу:

id   name        rating_count
1    Product1    2
2    Product2    1

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

надеюсь, что мини-учебник работает. Если нет, я предлагаю лучше узнать SQL, прежде чем продолжать использовать codeigniter. если вы не понимаете, что делает codeigniter за кулисами, вы не сможете контролировать свой вывод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...