Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Выборка из нескольких таблиц
Покинул форум
Сообщений всего: 19
Дата рег-ции: Июль 2014
Помог: 0 раз(а)
Здравствуйте.
Есть 4 таблицы, хочу все необходимые данные получить из одного запроса в бд.
relation_pt - в ней привязки между post_id и tag_id, потому как у posts может быть несколько тегов.
Однако есть небольшая проблема. Поскольку тегов у записи может быть несколько, я бы хотел выдернуть массив этих тегов, т.е. результат получить в таком варианте:
Вопрос: Есть ли возможность получить результат с массивом тегов? И как?
Мб есть более производительное решение?
Спасибо! Прикреплено изображение (Нажмите для увеличения)
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
Можно, но лучше не надо.
И вам и СУБД будет проще, если теги вытянете отдельным запросом:
сначала посты, собираете id постов, для которых надо достать теги, вторым запросом достаёте теги по этому списку постов.
----- PostgreSQL DBA
Specter
Отправлено: 28 Августа, 2014 - 12:26:17
Новичок
Покинул форум
Сообщений всего: 19
Дата рег-ции: Июль 2014
Помог: 0 раз(а)
Спасибо за ответ.
Мелкий пишет:
Можно, но лучше не надо.
И вам и СУБД будет проще, если теги вытянете отдельным запросом:
сначала посты, собираете id постов, для которых надо достать теги, вторым запросом достаёте теги по этому списку постов.
Для всех постов нужно достать теги, но не у всех постов есть теги.
Так много запросов ведь получается, формируем массив из id постов, через where в relation_pt получаем все id тегов, что есть у поста, потом только забираем данные тегов.
Потом результирующий массив нужно будет перебрать и засунуть массив тегов туда.
Не много ли телодвижений? Мне нисколько не проще.
Использую CI, поэтому предпочтительно иметь один большой массив.
Чисто в качестве обучения можете привести запрос, который получает данные за один раз, как описал я в начале темы?
$sGetTags="select post_id, tag_name from tags where post_id in (".join(',',array_keys($rgPosts)).")";
foreach($db->query($sGetTags)as$rgTag){
$rgPosts[$rgTag['post_id']]['tags']=$rgTag;
}
}
Для вашей структуры таблиц конкретные запросы было писать лениво, но суть должна быть ясна.
----- PostgreSQL DBA
Specter
Отправлено: 28 Августа, 2014 - 14:43:16
Новичок
Покинул форум
Сообщений всего: 19
Дата рег-ции: Июль 2014
Помог: 0 раз(а)
А если допустим выводим конкретный пост, делать также 2 запроса?
или "лучше" будет сделать один запрос?
Мелкий
Отправлено: 28 Августа, 2014 - 15:04:56
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
Да, тоже два.
Прочитать по ключу быстрее, чем прочитать по ключу и группировать результат (который из-за текстовых полей группироваться будет на диске)
----- PostgreSQL DBA
Specter
Отправлено: 28 Августа, 2014 - 15:05:41
Новичок
Покинул форум
Сообщений всего: 19
Дата рег-ции: Июль 2014
Помог: 0 раз(а)
подытожим(на будущее) :2 foreach + 2 запроса в бд легче и быстрее чем один с кучей джоинов?
$sGetTags="select post_id, tag_name from tags where post_id in (".join(',',array_keys($rgPosts)).")";
foreach($db->query($sGetTags)as$rgTag){
$rgPosts[$rgTag['post_id']]['tags']=$rgTag;
}
}
Для вашей структуры таблиц конкретные запросы было писать лениво, но суть должна быть ясна.
Дык, в два запроса не получится. Потому что нужно будет собрать связи из relation_pt. id постов допустим в переборе массива мы получили, далее нужно получить из relation_pt id тегов. Снова перебрать полученный массив, и только можно будет по id тегов из tags получить данные тегов.
Хм, тут как минимум 3 запроса и 3 цикла.
Sail
Отправлено: 28 Августа, 2014 - 15:48:46
Участник
Покинул форум
Сообщений всего: 1131
Дата рег-ции: Февр. 2014
Помог: 57 раз(а)
Specter пишет:
получить из relation_pt id тегов. Снова перебрать полученный массив, и только можно будет по id тегов из tags получить данные тегов
А вот тут-то и надо "join-ить"!
Specter
Отправлено: 28 Августа, 2014 - 16:17:22
Новичок
Покинул форум
Сообщений всего: 19
Дата рег-ции: Июль 2014
Помог: 0 раз(а)
Sail пишет:
Specter пишет:
получить из relation_pt id тегов. Снова перебрать полученный массив, и только можно будет по id тегов из tags получить данные тегов
Короче очень не удобно получается. И не понятно как засунуть в данные поста данные тегов?
Итого уже два запроса к бд и один цикл. (Добавление)
Как вариант в результирующем массиве прямо указывать индекс от post_id.
***
А если речь о "добыче" информации из массива тегов для определённого поста, то с некоторых пор есть в PHP функция: array_column(), которая может вернуть массив со значениями, взятыми из одной колонки массива и индексами - из другой...
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.