我有一个包含产品names
,description
,prices
等的表格,另一个表格是管理员可以添加自定义列来展开第一个表格。这些列是通过php表单创建的。我无法知道用户将创建多少。
例如,我的"产品" 表格包含:
id
name
description
price
created
第二个表" products_custom" 有:
id
product_id //this value holds the product id from the above table
serial_number //a custom column the user created
product_image //another column the user created
现在,为了在表格中显示所有这些值,我必须根据products.id
和products_custom.product_id
左键加入2个表格。
正确的SQL查询应该是:
SELECT p.*, pc.serial_number, pc.product_image FROM products AS p
LEFT JOIN products_custom as pc ON p.id = pc.product_id ORDER BY p.id ASC
我可以使用查询第二个表的php函数获取products_custom表中存在的单元格名称,因此在上面的查询中使用这些值并不是问题。我可以将这些列名称返回给变量。
(example: $mycolumns = "serial_number,product_image")
问题是这个查询偶然也可以。
SELECT p.*, serial_number,product_image FROM products AS p
LEFT JOIN products_custom ON p.id = products_custom.product_id ORDER BY p.id ASC
这应该有用吗?我可以这样离开吗?或者我应该添加电脑。在$mycolumns
所拥有的每个值中加上前缀,然后重新构建sql,使其看起来像是一个正确的查询'我上面写的?
提前致谢!
最终编辑: 根据下面的答案,将SQL转换为包含pc.prefix的一系列列名:
//$whatCol = "serial_number,product_image";
$choices = explode(",", $whatCol);
foreach($choices as &$choice) {
$choice = "pc.".mysql_real_escape_string($choice);
}
$whatColSQL = implode(",", $choices);
$prSQL = "SELECT p.*, $whatColSQL FROM products AS p LEFT JOIN products_custom as pc ON p.id = pc.product_id ORDER BY p.id ASC";
答案 0 :(得分:0)
是的,您应该使用pc.
表别名。
工作的原因是因为这些列名对于查询表是唯一的。
我说你应该使用pc.
别名的原因是为了防止用户在products_custom
表中创建自定义列名(products
)的可能问题。例如,description
或price
。如果没有pc.
别名,重复的列名称将(应该)抛出SQL Error 1052 Ambiguous
。
编辑:根据Drew的评论包含并更改了一些细节。