Группирование данных SQL в MySQL Side или PHP? - PullRequest
0 голосов
/ 15 января 2009

У меня есть следующие таблицы в MySQL:

team: id, name, [more stuff]
person: id, name, team, [more stuff]
entry: id, name, team, [more stuff]
registrations: id, event_id, team, status
registration_people: registration_id, person_id
registration_entries: registration_id, entry_id

Я хотел бы запросить базу данных и вернуть подробную информацию о каждом человеке и записи; сгруппированы по регистрации. За эти годы я научился делать как можно больше в SQL. Однако я не вижу хорошего способа сгенерировать это в одном запросе, не выполняя большую работу в PHP. Наивный способ сделать это будет [псевдокод]:

$registrations = $model->get_registrations($event_id);
foreach ($registrations as $registration)
{
    $registration['people'] = $model->get_people_in_registration($registration['id']);
    $registration['entries'] = $model->get_entries_in_registration($registration['id']);
}
return $registrations;

Этот код выполняет многократные обращения к серверу и не должен использоваться. У меня была другая идея сделать что-то подобное:

$registrations = $model->get_registrations($event_id);
$registration_entries = $model->get_registration_entries($event_id);
$registration_people = $model->get_registration_people($event_id);
foreach ($registrations as $r)
    $reg[$r['id']] = $r;
foreach ($registrations_entries as $e)
    $reg[$e['registration_id']]['entries'][] = $e;
foreach ($registrations_people as $p)
    $reg[$p['registration_id']]['people'][] = $p;
return $reg;

Где get_registration_entries/get_registration_people выполняет объединение и получает все registration_entries, связанные с регистрациями в $event_id. Тем не менее, похоже, что я делаю соединение в PHP; когда я смогу заставить SQL сделать это для меня. Я просто параноик, или я что-то здесь упускаю?

1 Ответ

2 голосов
/ 15 января 2009

Концепция «делай как можно больше в SQL» действительна только в том случае, если она уменьшает объем данных, считываемых из базы данных, или количество обращений в базу данных. Если вам все равно нужно получить данные, какой смысл группировать их в базе данных? Это гораздо проще сделать в PHP.

Вы должны сделать что-то вроде этого:

select r.registration_id, p.*
from registration_people rp, registrations r, person p
where /* your filter conditions on the "registration" table */
and rp.registration_id = r.id
and p.id = rp.person_id

(Полагаю, это похоже на ваш второй подход)

Таким образом, вы получаете все необходимые данные из базы данных, и не более. Теперь вы можете сгруппировать результаты локально в PHP. Этот подход достаточно эффективен, поскольку вы получаете столько данных из базы данных, сколько вам нужно, и не делаете ненужных обращений к базе данных.

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