2011-06-22 19 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