Форум программистов, компьютерный форум, киберфорум
PHP: базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
 Аватар для webphp
55 / 53 / 18
Регистрация: 05.08.2013
Сообщений: 327

Сложный запрос фигурируют три таблицы

09.12.2013, 10:44. Показов 718. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Решил сделать поиск по сайту (по тегам) в котором фигурируют три таблицы.
Первая таблицы картинок
Code
1
2
TABLE
id | image | tags
Полу tags содержит теги через запятую (тег, тег, тег, тег)

Вторая таблица список всех существующих тегов
Code
1
2
TABLE_TAG
id | name
name - тег

Третья таблица связывает TABLE.id = TABLE_TAG.id
Code
1
2
TABLE_TAG_INIT
image_id | tag_id
На примере выглядит это следующим образом
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
TABLE
1 | pic.gif | слово, слово 2, слово 3, слово 4
---------------------------------------------------
TABLE_TAG
1 | слово
2 | слово 2
3 | слово 3
4 | слово 4
---------------------------------------------------
TABLE_TAG_INIT
1 | 1
1 | 2
1 | 3
1 | 4
На ум приходит два варианта выборки, самый просто поиск с помощью LIKE, который будет перебирать одну таблицу TABLE по полю tags на вхождение запроса. Но при большом всего скорее это будет слишком нагружено, к тому же на одной странице нужно выполнять 6 таких запросов, так как контент разделен на 6 блоков.

Второй вариант я не могу решить, но логику примерно представляю, а вот по нагрузкам даже и не представляю.
К примеру есть тег "слово", данный тег присутствует в 10 000 картинок, т.е. в таблице TABLE_TAG_INIT содержится 10 000 TABLE.id

Для того чтобы мне узнать все TABLE.id содержащие тег "слово" я склеиваю две таблицы TABLE_TAG и TABLE_TAG_INIT
SQL
1
SELECT * FROM (`TABLE_TAG`) JOIN `TABLE_TAG_INIT` ON `TABLE_TAG_INIT`.`tag_id` = `TABLE_TAG`.`id` WHERE `name` = 'слово'
Получаю массив данных в котором содержатся все TABLE.id
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
Array
(
    [0] => stdClass Object
        (
            [id] => 1
            [name] => слово
            [image_id] => 22
            [tag_id] => 63
        )
 
    [1] => stdClass Object
        (
            [id] => 1
            [name] => слово
            [image_id] => 98
            [tag_id] => 63
        )
 
    [2] => stdClass Object
        (
            [id] => 1
            [name] => слово
            [image_id] => 172
            [tag_id] => 63
        )
 
    [3] => stdClass Object
        (
            [id] => 1
            [name] => слово
            [image_id] => 195
            [tag_id] => 63
        )
    )
Получил все ID картинок (image_id)
а именно 22|98|172|195

И тут у меня тупик, т.е. прогнать все это дело через цикл и ОПЯТЬ токи дергать записи с таблице TABLE.id по одной штуке, что то не хочется (да это вариант, но думаю есть какая то еще выборка позволяющая выбрать список записей по ID не перебираю их по одному).

Есть ли у кого идеи по этому поводу?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.12.2013, 10:44
Ответы с готовыми решениями:

Сложный запрос на создание таблицы
Добрый вечер. Дана Таблица1 и дана Таблица2,нужно создать такой запрос чтобы за одним атрибутом Таблицы1 наблюдало несколько атрибутов...

Сложный запрос с JOIN внутри таблицы
Задача следующая. Есть таблица Международной Классификации Болезней (МКБ 10). 23000 записей. В ней следующие столбцы: ID PARENT -...

Сложный запрос из одной таблицы с предварительной обработкой данных
Ребята не очень силен в запросах и токо начал осваивать постгри. есть таблица структура: camid- камера id, action-(принимает attach или...

6
4217 / 3059 / 583
Регистрация: 21.01.2011
Сообщений: 13,203
09.12.2013, 11:41
Цитата Сообщение от webphp Посмотреть сообщение
Полу tags содержит теги через запятую (тег, тег, тег, тег)
Это плохое решение. Обычно в подобном случае заводят отдельную таблицу, где будут хранится тэги картинок, каждый в отдельной строке. Тогда не будет никаких проблем с построением SELECT.
0
 Аватар для webphp
55 / 53 / 18
Регистрация: 05.08.2013
Сообщений: 327
09.12.2013, 12:31  [ТС]
Цитата Сообщение от Grossmeister Посмотреть сообщение
Это плохое решение. Обычно в подобном случае заводят отдельную таблицу, где будут хранится тэги картинок, каждый в отдельной строке. Тогда не будет никаких проблем с построением SELECT.
Так а у меня как?
Вторая таблица список всех существующих тегов
Code
1
2
TABLE_TAG
id | name
просто
есть таблица связка
Третья таблица связывает TABLE.id = TABLE_TAG.id

Code
1
2
TABLE_TAG_INIT
image_id | tag_id
0
4217 / 3059 / 583
Регистрация: 21.01.2011
Сообщений: 13,203
09.12.2013, 13:05
Цитата Сообщение от webphp Посмотреть сообщение
Так а у меня как?
Тогда зачем нужно поле, содержащее тэги через запятую?
0
 Аватар для webphp
55 / 53 / 18
Регистрация: 05.08.2013
Сообщений: 327
09.12.2013, 13:27  [ТС]
Цитата Сообщение от Grossmeister Посмотреть сообщение
Тогда зачем нужно поле, содержащее тэги через запятую?
Ну наверное чтобы выводить теги к изображению не склеивая три таблицы вместе!?
Лишние запросы же ни к чему.
Хотя выслушаю ваше мнение или какие то идеи, не исключено что я не прав, было бы супер по обсуждать это.

По теме, решил проблему склеив три таблицы, вроде бы работает очень шустро, но еще поэксперементирую, попробую как с like работает, но уверен что через него дольше.
0
1178 / 1128 / 94
Регистрация: 31.05.2012
Сообщений: 3,060
09.12.2013, 15:56
У вас три таблицы, связка многие ко многим. и ещё сразу список тегов в поле чрез запятую.
по сути это просто дублирование данных, при выводе, совершенно не обязательно каждый раз выполнять запрос, для это применяют кеш. Искать по полю через запятую тоже нет смысла

что бы найти все записи с тегом Лопата
MySQL
1
2
3
4
SELECT `t`.* FROM `TABLE` `t`
JOIN `TABLE_TAG_INIT` `ti` ON `t`.`id` = `ti`.`image_id`
JOIN `TABLE_TAG` `tt` ON `tt`.`id` = `ti`.`tag_id`
WHERE `tt`.`name` = 'Лопата';
Вы получите все записи с этим тегом.
добавьте индексы ко всем полям в запросе, особенно к полю name, что бы поиск по строке был быстрым.
0
 Аватар для webphp
55 / 53 / 18
Регистрация: 05.08.2013
Сообщений: 327
09.12.2013, 16:34  [ТС]
У меня примерно так и сделано, только пришлось еще пару таблиц добавить, так как в них нужно для вывода информация
MySQL
1
2
3
4
5
6
7
8
SELECT *
FROM (`tags`)
JOIN `tags_init` ON `rw_tags_init`.`tag_id` = `tags`.`id`
JOIN `image` ON `image`.`id` = `tags_init`.`wall_id`
LEFT JOIN `categories` ON `categories`.`c_id` = `image`.`category`
WHERE `tag` =  'автомобиль'
ORDER BY `added_at` DESC
LIMIT 384, 2
Данный запрос обрабатывается за 0.006сек. что очень даже радует.

Теги храню в таблице image, чтобы не делать таких запросов где они не нужны.
Есть страница картинки, где необходимо вывести теги, запрос выше как раз таки будет делать лишние телодвижения, а мне достаточно сделать все лишь
MySQL
1
2
3
4
SELECT *
FROM (`rw_categories`)
RIGHT JOIN `image` ON `image`.`category` = `categories`.`c_id`
WHERE `id` =  10476
Думаю это стоит того, хранить теги картинки в поле информации о картинки, с другой стороны если учесть что первый запрос выполняется за 0.006, то да, возможно и нет смысла, так как в тих двух запросах разница всего в 0.005сек.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.12.2013, 16:34
Помогаю со студенческими работами здесь

В запросе к БД фигурируют 3 таблицы. Нужны данные по двум условиям
1. Первая таблица oc_product. Берем поля model и geolocation 2. Вторая таблица oc_product_description. Берем поля name и meta_keyword ...

Сложный запрос? Поля из одной таблицы, и поля из другой таблицы, но...
Вот так мы делаем выборку из основной таблицы table1: SELECT t1.ID, t1.f2, t1.f3 FROM table1 t1 WHERE (какой-то простой фильтр) ...

Запрос на три таблицы
Есть три таблицы - Таблица1, Таблица2, Таблица3. Таблицы по структуре абсолютно одинаковые, скажем поля - номер_задачи(ключевое...

Запрос на три связанные таблицы
Здравствуйте! Имеется три вот такие таблицы: http://jpegshare.net/images/3b/23/3b23554566296c0b493333e09a3293f2.jpg Таблица...

SQL запрос на три таблицы
Здравствуйте! Помогите написать SQL запрос... Список форумов -> темы в определенном форуме -> тема. Мне нужно достать количество всех...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Вывод данных через динамический список в справочнике
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru