MySQL Query, где я добавляю несколько записей в одну запись - PullRequest
1 голос
/ 29 мая 2011

Так что я действительно плохо формулирую это, поэтому, пожалуйста, потерпите меня.

Я создаю сайт, на котором люди могут покупать подарки для детей, и каждый ребенок может иметь несколько подарков в своем списке.

У меня есть две таблицы children и gift_list. Таблицы очень простые со следующими строками:

children
  - id
  - name
  - age
  - status

gift_list
  - id
  - child_id
  - description
  - status

Я пытаюсь захватить все подарки, которые принадлежат ребенку, и вернуть их как массив дочерних объектов, но я получаю странные результаты.

Вот мой текущий оператор SQL:

SELECT * FROM children JOIN gift_list WHERE gift_list.child_id = children.id

Результат:

Child A:
  - id
  - name
  - age
  - status
  - gift A

Child A:
  - id
  - name
  - age
  - status
  - gift B

Я знаю, что мне нужно перебрать таблицу gift_list, а затем добавить их в массив, но я новичок в MySQL и заблудился с концепцией и не могу придумать, как правильно искать то, что Я пытаюсь достичь. Конечный результат идеи:

Child A:
  - id
  - name
  - age
  - status
  - gifts
     - gift A
        - description
        - status
     - gift B
        - description
        - status

Любая помощь будет высоко ценится! В качестве примечания и, вероятно, важно, я использую PHP-фреймворк CodeIgniter.

EDIT:

После нескольких неудачных попыток, используя приведенные ниже предложения, я наконец-то получил следующий код для работы ... может быть, есть лучший / более чистый способ сделать это ... если так, пожалуйста, подскажите мне:)

<code>$children = $this->db->get('children');
$gift_list = $this->db->get('gift_list');

foreach ( $children->result() as $child )
{
    $gifts = array();
    foreach ( $gift_list->result() as $gift )
    {
        if ( $child->id == $gift->children_id )
        {
            array_push($gifts, $gift);
            $child->gifts = $gifts;
        }
    } 
}

echo "<pre>";
print_r($children->result());
echo "
";

Спасибо за все предложения!

Ответы [ 2 ]

3 голосов
/ 29 мая 2011

Вам нужно выполнить 2 разных запроса.Первый получит детей, другой получит их подарки.

Пример первого запроса:

SELECT * FROM children WHERE ... any children-related criteria here ...

Теперь у вас должен быть массив (пока нет подарков):

Child A:
  - id (let's say this equals 1)
  - name
  - age
  - status

Child A:
  - id (let's say this equals 2)
  - name
  - age
  - status

Важно, чтобы ключи этого массива были дочерними идентификаторами (ну, по крайней мере, это облегчит задачу).

Используя этот массив, создайте следующий запрос:

SELECT * FROM gift_list WHERE child_id IN (1, 2);

Что вы можете сделать, используя что-то вроде:

$gifts_sql = 'SELECT * FROM gift_list WHERE child_id IN (' . implode(', ', array_keys($children)) . ')';

Теперь вы должны перебрать результат этого запроса и прикрепить его так:

while ($row = mysql_fetch_assoc($result)) {
    $children[$row['child_id']]['gifts][$row['gift_id']] = $row;
}

Ваш $childrenТеперь массив должен выглядеть так, как вы хотите.

0 голосов
/ 29 мая 2011

Вы говорите, что получаете странные результаты, но не то, что эти результаты. Если вы как-то перебираете результаты запроса, может быть, вам нужно упорядочить результаты? Добавить что-то вроде

ORDER BY children.id, gift.id

до конца, может быть.

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