PHP MySQL Получение данных из нескольких таблиц - PullRequest
0 голосов
/ 02 июня 2009

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

Это для справочного сайта. У меня есть три таблицы: entry , location и entry-location . запись содержит информацию о здании, такую ​​как имя, адрес, изображение и т. Д. location - это просто список возможных местоположений, которыми может быть каждое здание. Таблица местоположений для данного примера в значительной степени неактуальна, она просто содержит информацию о местоположении, которую я мог бы отображать в других областях сайта.

entry-location - это таблица, которая связывает записи с местоположениями. Он имеет только два поля: entry-id и location ... Если вам интересно, зачем мне отдельная таблица, это потому, что одно и то же здание может есть несколько мест (не спрашивайте).

По сути, мне нужно отобразить списки из каждого местоположения на своей странице. Например, мне нужно перечислить каждое здание во Франции, поэтому запрос должен пройти через таблицу entry-местоположения , возвращающую каждую запись с местоположением «Франция», а затем он должен извлечь все данные из entry таблица, соответствующая entry-id , возвращенных.

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

Ответы [ 4 ]

5 голосов
/ 02 июня 2009

Как насчет этого?

-- // Selects all the columns from both entry-locations and entry
SELECT * 
FROM entry-locations
JOIN entry e ON e.id = el.entry-id
WHERE el.location = 'France';

-- // To just get the entry data for matching records: (Remove DISTINCT if you
-- // don't mind, or want, each entry with multiple locations in the result set
-- // multiple times)
SELECT DISTINCT e.* 
FROM entry-locations el
JOIN entry e ON e.id = el.entry-id
WHERE el.location = 'France'

Редактировать: Хорошо, поэтому я попытался удалить таблицу местоположений и вместо этого использовал entry-location.location в качестве имени местоположения. Это правильно?

2 голосов
/ 02 июня 2009

Представьте, что у вас есть эти данные:

запись

|id|name|
| 1|Foo |
| 2|Bar |

Начальное Местоположение

|entry-id|location|
|1       |France  |
|2       |Greece  |
|2       |France  |

Вот так я понимаю таблицы из вашего описания. Более распространенный подход - иметь

Entry(id,name)
Location(id,name)
Entry_Location(entry_id, location_id)

Это также источник некоторых недоразумений в других постах, я думаю.

Теперь попросите MySql извлечь данные из обеих таблиц, где идентификатор совпадает.

SELECT entry.* 
FROM `entry`, `entry-location` as el
WHERE entry.id = el.`entry-id`
AND el.location = 'France';

MySql теперь обрабатывает ваши данные как одну таблицу, выглядящую так:

|entry.id|entry.name|el.location|
|       1|       Foo|     France|
|       1|       Foo|     Greece|
|       2|       Bar|     France|

И из этой таблицы он выбирает записи, где el.location = 'France', и возвращает указанные поля.

Этот запрос выбирает все поля из таблицы entry, которые соответствуют установленным вами требованиям. Во-первых, это заставляет MySql думать о двух таблицах как о одной таблице, *

-от обеих из них. *1029*

Посмотрите на MySql SELECT reference .

0 голосов
/ 02 июня 2009

Если я понял вашу идею, вам нужно: выберите e. * frmm entry join местоположения входа как l ON l.entry-id = e.id WHERE l.location = 'France'

0 голосов
/ 02 июня 2009

выберите * из записи, где идентификатор в (выберите идентификатор записи из местоположения записи)

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