структурировать данные php в mySQL - PullRequest
2 голосов
/ 13 июля 2011

У меня есть схема данных, подобная этой:

cp
    id    te    su
    1     7     2
    2     7     1
    3     6     8

cl
    id    cp    st
    1     2     5
    2     2     6
    3     1     6

us
   id    na
   ..    ..
   5     Joe
   6     Mike
   7     Tina
   ..    ..

Я хочу запустить php-функцию foo($te) с foo(7) для вывода таких данных из mySQL

[0]
    su: 1
    st_list:
        [0]
            id:6
            na:Mike
[1]
    su: 2
    st_list:
        [0]
            id:5
            na:Joe
        [1]
            id:6
            na:Mike

Я хочу знать, как лучше всего это сделать. Прямо сейчас я могу использовать JOINs, но результат выглядит так

[0]
    su: 1
    st_id:6
    st_na:Mike
[1]
    su: 2
    st_id:5
    st_na:Joe
[3]
    su: 2
    id:6
    na:Mike

Повторяется su:2 ... очевидно, что это не проблема в этом примере, проблема в том, что в реальной ситуации su представляет намного больше данных, которые я буду проходить через это «(какой бы ответ я ни выбрал).

EDIT: Я надеюсь, что вы понимаете, о чем я спрашиваю ... Я знаю, что многие из вас, ребята, гораздо более осведомлены в MySQL и разработке в целом, чем я, поэтому я спрашиваю об этом просто (У меня есть THS --- -> ХОТИТЕ ЭТО), потому что я думаю, что если бы я спросил более конкретно, я бы в конечном итоге сделал предположения о том, как он должен работать). Я хочу эффективное решение, потому что эти данные используются для заполнения результатов поиска.

Спасибо !!!!!!!!!!

Ответы [ 3 ]

5 голосов
/ 21 июля 2011

Вам нужно будет зациклить результаты самостоятельно и построить массив в нужном вам формате. MySQL не может дать вам результаты в нужном вам вложенном формате. Вот черновик (не проверен):

$su = 0;
$st_list = array();
$nested = array();
foreach ($results as $row) {
    if ($su != 0 && $row['su'] != $su) {
        $nested[] = compact('su', 'st_list');
    }

    if ($su != $row['su']) {
        $su = $row['su'];
        $st_list = array();
    }

    $st_list[] = array(
        'id' => $row['st_id'],
        'na' => $row['st_na'],
    );
}

$nested[] = compact('su', 'st_list');

Редактировать: Обычно лучше всего получить все результаты, которые вы хотите, используя один SQL-запрос. Это почти всегда самый эффективный способ сделать это. Но если это действительно важно для вас (а это критически важная часть вашего приложения), единственный способ узнать наверняка - это тестирование обоих методов. Многое зависит от структуры вашей базы данных, количества строк, индексов SQL и так далее.

0 голосов
/ 24 июля 2011

В вашей модели вы можете иметь что-то подобное ...

function get_te($te)
{
    $qry = $this->db->get_where('cp', array('te' => $te));
    $raw_te = $qry->result_array();
    $te = array();
    $i = 0;
    while($i < count($raw_te))
    {
        $te[$i]['su'] = $raw_te[$i]['su'];
        $qry = $this->db->select('*')
                        ->from('cl')
                        ->join('us', 'us.id = cl.id')
                        ->where('cp', $raw_te[$i]['id'])
                        ->get();
        $te[$i]['st_list'] = $qry->result_array();
        $i++;
    }
    return $te;
}
0 голосов
/ 21 июля 2011
SELECT distinct us.id,na FROM cp
LEFT JOIN cl ON cp.su = cl.cp
LEFT JOIN us ON us.id = cl.st
where te = "7"

Предоставляет ли это результаты, которые вы ищете?

С другой стороны,

SELECT su,us.id,na FROM cp
LEFT JOIN cl ON cp.su = cl.cp
LEFT JOIN us ON us.id = cl.st
where te = "7"
ORDER BY su

Близок к форматированию, которое вы просили в своем посте.

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