簡體   English   中英

SQL語句多對多

[英]SQL Statement many-to-many

我正在嘗試構造一條發生多對多關系的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類(零售和款待)的表,唯一的問題是如何查詢此表以確定聯系人是否在?

零售款待或兩者兼而有之...

由於細節水平較低,因此無法確定,但是:

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

多對多關系通常需要一個表來存儲關系。 即,不是聯系人表,不是類別表,而是單獨的“ 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');

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM