我正在尝试执行一个SQL调用,该调用从一个表中获取一行并从另一个表中计算记录。但是,该调用仅返回第一个SELECT的结果。代码如下:
$sql = "SELECT row_1 FROM table_1 WHERE user_id = :user_id
UNION
SELECT COUNT(row_2) as new_var FROM table_2 WHERE user_id = :user_id";
$query = $this->db->prepare($sql);
$params = array('user_id' => $var);
$query->execute($params);
$result = $query->fetch();
结果应为:
array(
'row_1' => val_1,
'new_var' => val_2
)
问题的解决方案无疑是简单的,但却让我望而却步!提前谢谢!
解决!
在这种情况下,UNION似乎不合适。修改SQL调用以使用JOIN解决了这个问题:
SELECT table_1.row_1, COUNT(table_2.row_2) AS new_var
FROM table_1 LEFT JOIN table_2
ON table_1.user_id = table_2.user_id AND table_1.user_id = :user_id
感谢您的帮助!
答案 0 :(得分:1)
如果我不得不猜测,那么row_1
是一个整数,其中一个值与计数完全匹配。
UNION
不仅结合了两个表/子查询。它还可以删除重复项。所以,我解决问题的第一个猜测是:
SELECT row_1 FROM table_1 WHERE user_id = :user_id
UNION ALL
SELECT COUNT(user_id) as new_var FROM table_2 WHERE user_id = :user_id
注意:您还应该确定哪些行是原始数据行,哪些行是摘要行。 SQL中的结果集是无序。无法保证按特定顺序返回行 - 除非您使用ORDER BY
。
答案 1 :(得分:1)
根据您的脚本,您似乎想要2列。一个row_1
,一个count(user_id)
。如果是这样,UNION
不是正确的运算符。
您的代码返回2行,每行一列。
但在PHP中,您调用了$query->fetch()
。这只返回第一行。
使用$query->fetchAll()
使用JOIN
而不是UNION