MySQL加入3个表和格式

I am using codeigniter and I am trying to call 3 different tables and join them together into one array. This is what I have:

$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();

The output I would like is the following:

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
                )  

)

My question is how do I make what I have work, right now there are two problems (that I have found) First it only outputs 1 result, I need it to output 40 and second I cant so_user.id = so_rating.idUser because I already group_concat(so_rating.idUser)Any Ideas? I am not even sure if this is the right way of doing it as I am still a php newbie.

EDIT:

Alcohol

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

Rating

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

User

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

can you provide some table schematics to work with? i also don't see any GROUP BY in your query. i assume you want to GROUP BY so_alcohol.id? if you want to group only by so_alcohol.id you will have to use an aggregate function on the remaining columns like max(so_alcohol.name) as name. further reading about max()

your second problem is really none. you can join on any available column even if you don't decide to have it in the result. example:

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

if you are thinking about splitting the value of firstName into single names afterwards, don't. have mysql produce one user per row and do the grouping in PHP while outputting.

Edit1: Example on GROUP BY

TABLE product

id   name
1    Product1
2    Product2

TABLE rating

rating_id   product_id
1           1
2           1
3           2

Join

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

outputs

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

adding a 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

will put all tuples that have the same value in the column id into one group:

id   name        rating_count
1    Product1    2
2    Product2    1

you are not allowed to select columns in your result, which you do not group by or use aggregate functions on. but mysql will let this slip and provide you with a reasonable result anyway.

hope that mini-tutorial works. if not i suggest to get to know SQL better before you continue to use codeigniter. if you don't understand what codeigniter does behind the curtains, you will not be able to control your output.