2012-02-23 4 views
0

Я использую codeigniter, и я пытаюсь вызвать 3 разных таблицы и объединить их в один массив. Это то, что у меня есть:MySQL объединяет 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.

EDIT:

Алкоголь

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 

ответ

2

вы можете предоставить некоторые таблицы схемы работы с? Я также не вижу GROUP BY в вашем запросе. Я предполагаю, что вы хотите GROUP BY so_alcohol.id? если вы хотите группировать только so_alcohol.id, вам придется использовать функцию агрегата на оставшихся столбцах, например max(so_alcohol.name) as name. further reading about 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. если вы не понимаете, что делает конифицир за шторами, вы не сможете контролировать свой результат.

+0

Я рассмотрел схемы таблиц. В соответствии с вашим запросом я не уверен, что будет делать группа по функциям .... Я по-прежнему очень зеленый с php/msql, я надеялся, что вы погрузитесь в создание сайта, чтобы узнать, что мне нужно узнать. Во второй части я всегда получаю сообщение об ошибке в Mysql, говоря, что я не могу сделать 'so_user.id = so_rating.idUser', потому что раньше я его« GROUP_CONCAT ». Не возражаете ли вы показать мне пример того, как вы сейчас справитесь с этим, когда я подниму схему таблиц? – Jacinto

+0

Вы могли бы скопировать сообщение об ошибке для нас, пожалуйста? – Basti

+0

Nevermind Я идиот, я не положил, в конце. нормально, вторая часть работает, но я все еще получаю только 1 алкоголь, 1 отзыв и 1 пользователь. Я хочу получить 40 спиртов, 5 отзывов и 5 пользователей – Jacinto

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