SQL语句多对多

时间:2009-09-17 15:14:01

标签: php sql mysql

我正在尝试构建一个发生多对多关系的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 :(得分:0)

不太确定,因为细节水平相当低,但是:

$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;");

答案 1 :(得分:0)

多对多关系通常需要一个表来存储关系。即,不是联系人表,不是类别表,而是单独的“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');
相关问题