Как объединить несколько таблиц, связанных другими таблицами - PullRequest
5 голосов
/ 29 сентября 2011

Я разрабатываю сайт, где люди могут публиковать свои дома в аренду.Я использую php 5.2.0 и MySQL 5 +

публикации хранятся в такой таблице

ta_publications
+---+-------------+------+
|id |    name     | date |
+---+-------------+------+
| 1 | name_001    |  ... |
| 2 | name_002    |  ... |
| 3 | name_003    |  ... |
+---+-------------+------+

У меня есть разные публикации, в которых есть такие «функции», как «Интернет»"," made service "," спутниковое телевидение "и т. д.

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

ta_features
+---+-------------+
|id | name        |
+---+-------------+
| 1 | Internet    |
| 2 | Wi-Fi       |
| 3 | satelital tv|
+---+-------------+

, которые связаны с публикациями, использующими следующую таблицу

ta_publication_features
+---+-------------+----------------+
|id |   type_id   | publication_id |
+---+-------------+----------------+
| 1 |      1      |       1        |
| 2 |      2      |       1        |
| 3 |      3      |       1        |
+---+-------------+----------------+

Я думаю, что это довольно легко понять;Существует публикация под названием name_001, в которой есть Интернет, Wi-Fi и спутниковое телевидение.

У меня одна и та же схема данных для изображений, я храню их в этой таблице

ta_images
+---+-------------+
|id | src         |
+---+-------------+
| 1 | URL_1       |
| 2 | URL_2       |
| 3 | URL_3       |
+---+-------------+

Ииспользуйте следующую таблицу, чтобы связать их с публикациями

ta_publication_images
+---+-------------+----------------+----------+
|id |  img_id     | publication_id |   order  |
+---+-------------+----------------+----------+
| 1 |      1      |       1        |    0     |
| 2 |      2      |       1        |    1     |
| 3 |      3      |       1        |    2     |
+---+-------------+----------------+----------+

. Порядок столбцов дает порядок, в котором публикации должны отображаться при перечислении одной публикации.

Филипп Рейхарт предоставил мне запросэто будет искать и получать все публикации, которые имеют определенные функции.Он работает для перечисления публикаций, я не могу изменить его, чтобы он возвращал мне нужные мне данные.

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

Список этих публикаций должен включать все данные публикации (все в ta_publications) + все ее особенности + самое важное (порядок 0) изображение.

Iможет иметь для каждой публикации два простых запроса, которые будут возвращать отдельно самое важное изображение и все функции, которые он имеет, но при перечислении 25 публикаций на странице это будет 1 поисковый запрос + (2 запроса на публикацию * 25публикаций) = 51 различных запросов, явно не очень эффективных.

РЕДАКТИРОВАТЬ:

Мой вопрос состоит в том, как я могу создать запрос SQL, который при некоторых идентификаторах публикации будет возвращать: все данные публикации(все в ta_publications) + все его особенности + самое важное (порядок 0) image src

Ответы [ 2 ]

1 голос
/ 29 сентября 2011

Вы получите избыточные данные публикации и изображения с этим, но вот способ сделать это одним запросом:

   SELECT p.id, p.name, p.date,
           f.id, f.name,
           i.id, i.src
    FROM ta_publications p
    JOIN ta_publication_features pf ON p.id = pf.publication_id
    JOIN ta_features f ON f.id = pf.type_id
    JOIN ta_publication_images pi ON p.id = pi.publication_id 
         AND pi.order = 0
    JOIN ta_images i ON i.id = pi.img_id
    WHERE p.id IN (  -- list of publication ids );
1 голос
/ 29 сентября 2011
 Select pub.Name as [Publication], f.name as [Feature], i.name as [Image] from ta_publications pub
Join ta_publications_features pf on pf.publication_id = pub.id
Join ta_features f on f.id = pf.type_id
Join ta_publication_images pi on pi.publication_id = pub.id
Join ta_images i on i.id = pi.img_id
Where pub.id = 'appropriate id'
order by i.[order]

Если я правильно следил за вашей структурой, это должно дать вам необходимые объединения. и вы можете добавить желаемые столбцы к результату в выбранной статистике, добавив .. надеюсь, это поможет.

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