SQL оператор многие ко многим - PullRequest
1 голос
/ 17 сентября 2009

Я пытаюсь построить оператор SQL, в котором встречается отношение многих ко многим. По сути, я хочу получить данные о бизнесе, основанные на 2 категориях, некоторые из которых включены в обе категории и запрашиваются через почтовый индекс. Пока что у меня есть часть с почтовым индексом, но она не различает категорию, и у меня нет таблицы для категорий, а также какой самый эффективный способ сделать это?

Здесь приведен SQL-оператор:

$query = "SELECT * FROM contacts WHERE zipcode in ( " . join(",", $zipcodes) . " ) ";

Вот структура таблицы. очень просто.

`company_name` char(55) NOT NULL,
`phone` char(20) default NULL,
`email` char(40) default NULL,
`address` text,
`city` text,
`state` text,
`zipcode` varchar(5) default NULL,
`id` varchar(10) NOT NULL,
`geo_id` varchar(20) NOT NULL,
`website` varchar(40) NOT NULL,
`vendor_id` varchar(10) NOT NULL

`id` int(11) unsigned NOT NULL auto_increment,
`zip_code` varchar(5) character set utf8 collate utf8_bin NOT NULL,
`city` varchar(50) character set utf8 collate utf8_bin default NULL,
`county` varchar(50) character set utf8 collate utf8_bin default NULL,
`state_name` varchar(50) character set utf8 collate utf8_bin default NULL,
`state_prefix` varchar(2) character set utf8 collate utf8_bin default NULL,
`area_code` varchar(3) character set utf8 collate utf8_bin default NULL,
`time_zone` varchar(50) character set utf8 collate utf8_bin default NULL,
`lat` float NOT NULL,
`lon` float NOT NULL,
PRIMARY KEY  (`id`),
KEY `zip_code` (`zip_code`)

У меня нет таблицы категорий. Я составлю таблицу с 2 категориями (розничная торговля и гостиничный бизнес). Проблема только в том, как я могу запросить эту таблицу, чтобы определить, есть ли контакт?

розничная гостеприимство или оба ...

Ответы [ 2 ]

0 голосов
/ 17 сентября 2009

Отношения «многие ко многим» обычно требуют таблицы только для хранения отношений. То есть не таблица контактов, не таблица категорий, а отдельная таблица contact_categories.

Сам стол может быть очень простым:

CREATE TABLE contact_categories (
  contact_id VARCHAR(10) NOT NULL REFERENCES contact (id),
  category_id INT NOT NULL
);

(С этой таблицей вам даже не нужна отдельная таблица категорий, если вы помните, что категория 1 - это розничная, а 2 - например, гостеприимство)

Тогда, если контакт относится к одной категории, для него есть одна строка в таблице contact_categories. Если это в двух категориях, то есть две строки и т. Д.

Чтобы отобразить все предприятия категории 1, ваш выбор выглядит следующим образом:

SELECT contacts.*
FROM contacts
    JOIN contact_categories ON (contacts.id = contact_id);

Если вы хотите ограничить по почтовому индексу, просто добавьте предложение WHERE:

SELECT contacts.*
FROM contacts
    JOIN contact_categories ON (contacts.id = contact_id)
WHERE zipcode in ('12345','23456','90210');
0 голосов
/ 17 сентября 2009

Не совсем уверен, из-за довольно низкого уровня детализации, но как насчет:

$query = "SELECT * FROM contacts WHERE zipcode in ( " . join(",", $zipcodes) . " ) AND category1 = YOUR_DESIRED_VALUE AND category2 = YOUR_DESIRED_VALUE;";

или только в одной категории:

$query = "SELECT * FROM contacts WHERE zipcode in ( " . join(",", $zipcodes) . " ) AND (category1 = YOUR_DESIRED_VALUE OR category2 = YOUR_DESIRED_VALUE;");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...