Php SQL语句多对多

Php SQL语句多对多,php,sql,mysql,Php,Sql,Mysql,我试图构造一个SQL语句,其中出现多对多关系。基本上,我想检索基于两个类别的业务有些业务包含在两个类别中,并通过邮政编码查询。到目前为止,我得到了邮政编码部分,但它没有区分类别,我也没有类别表。做这件事最有效的方法是什么 以下是迄今为止的SQL语句: $query = "SELECT * FROM contacts WHERE zipcode in ( " . join(",", $zipcodes) . " ) "; 这是表格结构。很简单 `company_name` char(55) NO

我试图构造一个SQL语句,其中出现多对多关系。基本上,我想检索基于两个类别的业务有些业务包含在两个类别中,并通过邮政编码查询。到目前为止,我得到了邮政编码部分,但它没有区分类别,我也没有类别表。做这件事最有效的方法是什么

以下是迄今为止的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类零售和酒店的表格,唯一的问题是我如何查询此表格以确定联系人是否在

零售业 好客
或者两者兼而有之……

由于细节层次较低,所以不太确定,但是:

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

多对多关系通常只需要一个表来存储关系。即,不是联系人表,也不是类别表,而是单独的“联系人类别”表

表格本身可以非常简单:

CREATE TABLE contact_categories (
  contact_id VARCHAR(10) NOT NULL REFERENCES contact (id),
  category_id INT NOT NULL
);
使用此表,您甚至不需要单独的categories表,例如,如果您记得categories 1是零售,categories 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');

需要更多关于表结构的信息。contacts是业务表,zipcode是美国所有城市zipcodes的一个纬度。我唯一需要做的是创建一个表,其中包含一个类别字段和3个可能的值retail、hospitality,然后检查联系人的显示位置,可以是retail biz、hospitality biz,也可以是两者。同意cletus的意见。您能给出源表中的一些示例行和所需输出的示例吗?如果业务仅在一个类别中,这会返回错误吗