【发布时间】:2014-10-08 10:29:10
【问题描述】:
在这个fiddle 中,查询完美地创建了动态枢轴。我从 this 线程的成员 bluefeet 获取查询,并在我自己的表模式中对其进行了测试。
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'MAX(IF(a.attr_name = ''',
attr_name,
''', a.attr_value, NULL)) AS ',
attr_name
)
) INTO @sql
FROM attr;
SET @sql = CONCAT('SELECT p.model_id
, p.model_name
, ', @sql, '
from model p
left join model_attr t
on p.model_id = t.model_id
left join attr a
on t.attr_id = a.attr_id
GROUP BY p.model_id
, p.model_name');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
但在我的实际代码中,即使没有对查询进行修改,它也会引发语法错误:
[You have an error in your SQL syntax;
check the manual that corresponds to your MySQL server version for the right syntax
to use near 'SELECT GROUP_CONCAT(DISTINCT CONCAT( 'MAX(IF(a.attr_name = ''', ' at line 2]
这是实际代码:
$id = $_GET["id"];
function querySelect($sql,&$rows)
{
$link = database_link();
$result = mysqli_query($link,$sql);
$rows = array();
while($row = mysqli_fetch_array($result,MYSQLI_ASSOC))
{
$rows[] = $row;
}
return mysqli_num_rows($result);
}
$sql = "
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'MAX(IF(a.attr_name = ''',
attr_name,
''', a.attr_value, NULL)) AS ',
attr_name
)
) INTO @sql
FROM attr;
SET @sql = CONCAT('SELECT p.model_id
, p.model_name
, ', @sql, '
from model p
left join model_attr t
on p.model_id = t.model_id
left join attr a
on t.attr_id = a.attr_id
GROUP BY p.model_id
, p.model_name');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
";
querySelect($sql,$rows);
我也尝试过 PDO 方法,但它会抛出 SQLSTATE[HY000]: General error。查询与mysql不兼容吗?如果有,你有什么选择吗?
try
{
$dbh = new PDO("mysql:host=$hostname;dbname=$databasename", $username, $password);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = "
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'MAX(IF(a.attr_name = ''',
attr_name,
''', a.attr_value, NULL)) AS ',
attr_name
)
) INTO @sql
FROM attr;
SET @sql = CONCAT('SELECT p.model_id
, p.model_name
, ', @sql, '
from model p
left join model_attr t
on p.model_id = t.model_id
left join attr a
on t.attr_id = a.attr_id
GROUP BY p.model_id
, p.model_name');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
";
$users = $dbh->prepare($sql);
$users->execute();
$results = $users->fetchAll();
foreach($results as $result)
{
echo '<div>".$result["model_name"]."</div>';
}
$dbh = null;
}
catch(PDOException $e)
{
echo $e->getMessage();
}
【问题讨论】:
-
可能是这个
'MAX(IF(a.attr_name = '''试试把它改成MAX(IF(a.attr_name = '' -
Fred,尽管
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT GROUP_CONCAT(DISTINCT CONCAT( 'MAX(IF(a.attr_name = '', ' at line 2仍然出现错误 -
SELECT GROUP_CONCAT('DISTINCT CONCAT( 'MAX(IF(a.attr_name = ''', attr_name, ''', a.attr_value, NULL)) AS ', attr_name'怎么样 -
Fred,按照您的建议更改代码后,错误不会改变。
-
SELECT GROUP_CONCAT('DISTINCT CONCAT( 'MAX(IF(a.attr_name = ''', attr_name, ''', a.attr_value, NULL)) AS ', attr_name')同样的错误:[You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT GROUP_CONCAT('DISTINCT CONCAT( 'MAX(IF(a.attr_name = ''', attr_name, ''',' at line 2]