mysql从2个表中选择数据,但第2个表有动态单元名称

时间:2016-06-26 11:00:55

标签: php mysql

我有一个包含产品namesdescriptionprices等的表格,另一个表格是管理员可以添加自定义列来展开第一个表格。这些列是通过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.idproducts_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";

1 个答案:

答案 0 :(得分:0)

是的,您应该使用pc.表别名。

工作的原因是因为这些列名对于查询表是唯一的。

我说你应该使用pc.别名的原因是为了防止用户在products_custom表中创建自定义列名(products)的可能问题。例如,descriptionprice。如果没有pc.别名,重复的列名称将(应该)抛出SQL Error 1052 Ambiguous

编辑:根据Drew的评论包含并更改了一些细节。