PHP / MySQL搜索关系数据库模式的代码和逻辑

时间:2011-06-22 20:40:08

标签: php mysql relational-database

我已经创建了这个数据库模式,并且在这里的几个用户的帮助下,我有一个数据库,它将用户提交的业务条目存储在业务表中,这些业务表另外分组在catagories表中的大约10个catagories中的一个或几个之下,在tbl_works_catagories表中,将bus_id与catagory id匹配。

例如,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
)

现在,我接下来要做的是一个搜索功能,它将根据类别返回业务。例如,假设其中一个进入业务表的业务是面包师,当它被输入时,它被分类为Food(catagory_id 1)和外卖(catagory_id 2)。

因此,访问者搜索“食品”类别下列出的商家,并返回我们友好的邻居面包店。

与所有PHP / MySQL一样,我不能(最初无论如何)了解逻辑,更别关注代码!

3 个答案:

答案 0 :(得分: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*;

虽然您需要这些ID,但有几种方法可以做到这一点,我可能会说最直接的......

你从$ _POST获得类别,所以我们只说你输入了2个。 (食物和外卖)。无论你想要解析这些,有多种方法,但关键是它们来自$ _POST。

为你找到的每一个执行此类事情:

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

将这些结果存储在一个数组中...根据您拥有的数量,您可以构建一个类似于我先描述的类似的适用查询。 (请记住,您不需要和AND,如果您在此处返回> 1 category_id,则必须检测到这些内容)

我不会讨论像安全这样的事情。在执行包含用户提交数据的查询时要小心。

另一种解决方案可能涉及加入,不太清楚我的头脑是什么样的。

祝你好运。

答案 1 :(得分: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`)
)

然后您的搜索查询将类似于:

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*
使用JOIN的

将写为:

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*

答案 2 :(得分:0)

如果您希望所有与给定category-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或单数命名表。你混合了两者,可能会感到困惑。