PHP / SQL不确定如何处理

时间:2012-12-17 04:11:50

标签: php mysql sql

我有两个表格,类别和信息。

类别如下:

id | name 

信息看起来像:

id | parent_id | name | url

parent_id是类别中的id。

我有一个表单,用户可以在其中添加多个网址。可以按下一个按钮以显示更多的url字段。如果有多个url,则将url2,url3等添加到数据库中。

信息将如下所示:

id | parent_id | name | url | url2 | url3

这是一种合适的方法吗?

如果是这样,如果信息如下:

id | parent_id |name  |url            |url2          |url3
1  | 1         |One   |http://cnn.com |
2  | 1         |Two   |http://msn.com |http://aol.com|

当我查看一个或两个或w / e时,如何查询以获取其网址?

我知道我能做到:

$mysqli->query("SELECT i.url FROM info AS i LEFT JOIN categories AS c ON i.parent_id = c.id");

但这取决于我把i.url,i.url2,i.url3和我必须为每个信息创建一个单独的查询。我想要它,所以PHP确定选择多少和什么i.url。

所以它应该是:

$mysqli->query("SELECT (PHP determines what i.url to put here depending on what info page I'm viewing) FROM info AS i LEFT JOIN categories AS c ON i.parent_id = c.id");

2 个答案:

答案 0 :(得分:0)

不,这里正确的解决方案是另一个表,可能称为“info_urls”,它使用info-to-urls对一对多进行建模。

这是一种“规范化”设计,每个“信息”允许无限制的网址,并且很容易查询:

SELECT name, GROUP_CONCAT(info_urls.url) as urls 
FROM info JOIN info_urls ON info.id = info_urls.info_id;

列将如下所示:

id
info_id
url

此解决方案模拟了您不知道用户将输入多少URL的现实,并且您的RDBMS是针对CRUD 而不是列:-)(并且非常擅长加入它们一起查询)

答案 1 :(得分:0)

如果你走那条路,你会得到一堆带有空值的列,并遇到查询问题,这正是你所描述的。

我会创建一个不同的表(可能是网址),用infourl来映射。例如:

url_id | info_id | url 

这是重复属性设计模式,这里简要说明: http://www.tomjewett.com/dbdesign/dbdesign.php?page=phone.php

以下是有关如何查询的示例:

SELECT i.*, url
FROM info i JOIN urls u ON i.id = u.info_id