2011-06-22 17 views
1

我已經創建了這個數據庫模式,並且在這裏的幾個用戶的幫助下,我有一個數據庫,它將用戶提交的業務條目存儲在業務表中,這些條目還被分組到通過將bus_id與類別標識進行匹配,在tbl_works_catagories表中找到來自分類表的大約10個分類中的一個或幾個。關係數據庫模式的PHP/MySQL搜索代碼和邏輯

例如,bus_id 21可以與catagory_id 1,2,5,7有關,8

CREATE TABLE `business` (
`bus_id` INT NOT NULL AUTO_INCREMENT, 
`bus_name` VARCHAR(50) NOT NULL, 
`bus_dscpn` TEXT NOT NULL, 
`bus_url` VARCHAR(255) NOT NULL, 
PRIMARY KEY (`bus_id`) 
) 

CREATE TABLE `categories` (
`category_id` INT NOT NULL AUTO_INCREMENT, 
`category_name` VARCHAR(20) NOT NULL, 
PRIMARY KEY (`category_id`) 
) 

CREATE TABLE `tbl_works_categories` (
`bus_id` INT NOT NULL, 
`category_id` INT NOT NULL 
) 

現在,我想下一步該怎麼做是一個搜索功能,這將返回基於企業產品類別。例如,說進入商業桌的企業之一是麪包師,當它進入時,它在食品(catagory_id 1)和外賣(catagory_id 2)下被分類。

因此,訪問者搜索食品類別下列出的企業,並返回我們友好的鄰居麪包師。與所有的PHP/MySQL一樣,我不能(最初是反正)把我的腦袋放在邏輯上,而不介意代碼!

回答

0

您應該在表中設置外鍵以將它們鏈接在一起。

CREATE TABLE `business` (
`bus_id` INT NOT NULL AUTO_INCREMENT, 
`bus_name` VARCHAR(50) NOT NULL, 
`bus_dscpn` TEXT NOT NULL, 
`bus_url` VARCHAR(255) NOT NULL, 
PRIMARY KEY (`bus_id`) 
) 

CREATE TABLE `categories` (
`category_id` INT NOT NULL AUTO_INCREMENT, 
`category_name` VARCHAR(20) NOT NULL, 
PRIMARY KEY (`category_id`) 
) 

CREATE TABLE `tbl_works_categories` (
`bus_id` INT NOT NULL, 
`category_id` INT NOT NULL, 
FOREIGN KEY (`bus_id`) REFERENCES business(`bus_id`), 
FOREIGN KEY (`category_id`) REFERENCES categories(`category_id`) 
) 

那麼您的搜索查詢是這樣的:它使用JOIN

SELECT b.* 
FROM business b, categories c, tbl_works_categories t 
WHERE 
    b.bus_id = t.bus_id AND 
    c.category_id = t.category_id AND 
    c.category_id = *SOME SEARCH VALUE* 

將被寫成:

SELECT b.* 
FROM business b 
    JOIN tbl_works_categories t 
    ON b.bus_id = t.bus_id 
    JOIN categories c 
    ON c.category_id = t.category_id 
WHERE c.category_id = *SOME SEARCH VALUE* 
+0

您好,非常感謝,我已經在PHPmyadmin的tbl_work_catagories中設置了外鍵,所以我肯定會給出這個答案,只是爲了澄清一下,您的*一些搜索值*是來自我的用戶搜索或查詢的匹配ID?感謝 – Dan

+0

爲外鍵+1。但是請更改您的查詢,以便使用「JOIN」而不是與「WHERE」的隱式連接。這是非常古老的語法。 –

+0

@丹,是的,這將是來自用戶搜索查詢的匹配ID。 @ypercube,還沒有做過之前聯合... – Dirk

0

也許你想是這樣的:

SELECT `bus_id` FROM `tbl_works_categories` WHERE `category_id` = *some id from the search* 
     AND `category_id` = *some other id from the search*; 

雖然你需要那些ids-有幾個方法可以做到這一點,我將描述可能是最簡單的...

您從$ _POST中獲得類別,所以我們假設您已經輸入了2個類別。 (食物和外賣)。不管你想要解析這些,有多種方式,但重點是它們來自$ _POST。

執行這種對每一件事你會發現:

SELECT `category_id` FROM `categories` WHERE `category_name` LIKE '%*the name from $_POST*%'; 

存儲這些結果在一個數組...根據你多少你有沒有建立一個類似於我描述了一個適用查詢第一。 (請記住,你不需要和在那裏,這是你必須檢測,如果你從這裏第二個查詢返回> 1 category_id)

我不會過去的東西,像安全..總是要小心,當執行包含用戶提交的數據的查詢。

另一種解決方案可能涉及到一個連接,不太清楚那些看起來像我頭頂的東西。

祝你好運。

+0

@lainwakura嗨,謝謝你的回答,非常感謝。 – Dan

0

如果你想那些與給定類別中的所有企業-id,你的SQL語句看起來像這樣:

SELECT `business`.`bus_name` 
FROM `business` 
WHERE `business`.`bus_id` = `tbl_works_categories`.`bus_id` 
    AND `categories`.`category_id` = `tbl_works_categories`.`category_id` 
    AND `categories`.`category_id` = 1; 

其中1在這種情況下是您的食物類別,但可能是您的PHP變量,其中存儲用戶所選類別的ID。

有一個提示:一定要用plurar或singular命名錶。你混在一起可能會感到困惑。

+0

感謝提示坑(和查詢想法):) – Dan

+1

沒問題。有關使用單數還是複數的問題,請參見[表命名困境:單數與複數名稱](http://stackoverflow.com/questions/338156/table-naming-dilemma-singular-vs-plural-names ) – Pit