Многостоловый запрос MySQL - PullRequest
1 голос
/ 21 марта 2011

Привет! У меня возникают трудности при создании запроса, который ссылается на несколько таблиц. Я новичок в SQL, и объединения вводят меня в заблуждение. Я осмотрел Google, и после поиска я обнаружил Объединение таблиц в SQL , которое приблизило меня к тому месту, где я хочу быть! Созданный мной запрос не делает то, что я хочу. У меня есть две таблицы:

disp_profile
    disp_id*  name      address      zip
    0001      Profile1  SomeAddress1 11111
    0002      Profile2  SomeAddress2 22222
    0003      Profile3  SomeAddress3 33333

zipcode
    zip_code* state     city         county
    11111     CA        City1        County1
    22222     WA        City2        County2
    33333     NV        City3        County3

Я пытаюсь захватить город, штат, округ из почтового индекса, когда zipcode.zip = disp_profile.zip (отфильтрованный по переменной State). В идеале возвращать что-то вроде:

    dispId    dispName     dispAddress     dispZip    zipState    zipCounty    zipCity  zipCode
    001       Profile1     SomeAddress1    11111      CA          County1      City1    11111
or
    002       Profile2     SomeAddress2    22222      WA          County2      City2    22222


SELECT
    dp.disp_id AS dispId, dp.name AS dispName, dp.address1 AS dispAddress1, dp.zip AS dispZip, zc.state AS zipState, zc.county AS zipCounty, zc.city AS zipCity, zc.zip_code AS zipCode
FROM
    disp_profile dp
INNER JOIN
    zipcodes zc
ON
    dp.zip = zc.zip_code
WHERE
    dp.state = 'CA'

Я знаю, что это может быть не лучшим способом для этого, но я подумал, что лучше хранить вещи отдельно от избыточной информации для каждого элемента. Набор данных в disp_profile - около 1000 записей, а zip_codes - около 30000. Будет ли это легче сделать с помощью подзапроса? Спасибо за ваше время!

Ответы [ 2 ]

1 голос
/ 21 марта 2011

Нет, у вас все хорошо . Это то, что присоединяется там, где сделано для , здесь нет необходимости использовать подзапрос. Вы могли бы, но это не будет работать лучше (оптимизатор запросов MySQL может даже преобразовать его в объединение внутри).

Если вы беспокоитесь о скорости: поместите слово «EXPLAIN» перед оператором SELECT, чтобы увидеть, что делает MySQL:

EXPLAIN SELECT
    dp.disp_id AS dispId, dp.name AS dispName, dp.address1 AS dispAddress1, dp.zip AS dispZip, zc.state AS zipState, zc.county AS zipCounty, zc.city AS zipCity, zc.zip_code AS zipCode
FROM
    disp_profile dp
INNER JOIN
    zipcodes zc
ON
    dp.zip = zc.zip_code
WHERE
    dp.state = 'CA'

Он расскажет вам, как выполняется ваше заявление. Вставьте сюда вывод, если вы хотите, чтобы мы помогли интерпретировать:)

0 голосов
/ 21 марта 2011

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

select dp.disp_id AS dispId,
       dp.name AS dispName,
       dp.address1 AS dispAddress1,
       zc.state AS zipState,
       zc.county AS zipCounty,
       zc.city AS zipCity,
       zc.zip_code AS zipCode
from   disp_profile dp,
       zipcodes zc
where  dp.state = 'CA'
  and  dp.zip = zc.zip_code

но это просто вопрос стиля (и использование СУБД с очень интеллектуальным оптимизатором - подходит ли MySQL для моей выбранной СУБД, я не могу комментировать (но сомневаюсь в этом)).

Единственное изменение, которое я сделал (и которое вам, вероятно, следует), - это получить один почтовых индексов. Излишне получать поля как от dp, так и от zc, поскольку они идентичны благодаря вашему соединению.

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