我需要将MIN(files.file_id)
行的所有列加入/添加到此查询,而不是仅将MIN(files.file_id)
的值作为first_file_id
返回。
file_id
是自动广告主键。
表files
包含file_id,user_id,filename和timestamp列。
我进行了搜索,似乎可以通过加入一个临时表来选择行MIN(files.file_id)
,但无法正常工作。
$stmt = $db->prepare("
SELECT
accounts.account_id,
accounts.account_username,
accounts.account_password,
computers.computer_id,
users.user_id,
MIN(files.file_id) as first_file_id
FROM accounts
LEFT JOIN computers
on computers.account_id = accounts.account_id
LEFT JOIN users
on users.computer_id = computers.computer_id
LEFT JOIN files
on files.user_id = users.user_id
WHERE
accounts.account_id = :account_id and
computers.computer_name = :computer_name and
users.username = :username
");
//bindings (test values)
$stmt->bindValue(':account_id', 1);
$stmt->bindValue(':computer_name', 'COMPUTER_2');
$stmt->bindValue(':username', 'jenny');
//execute
$stmt->execute();
//result (can only be one or none)
$results = $stmt->fetch(PDO::FETCH_ASSOC);
修改
此链接类似于我的想法'我需要link here并显示创建一个包含行信息的临时表。
在观看了@Abhik Chakraborty的回应后,它让我思考。我删除了min,只是将选择添加到我想要的列files
并且它可以正常工作。为什么......因为我只返回一个结果(fetch),而files
的连接正在加入该表中与其他条件匹配的第一行。在这种情况下,对于该用户而言file_id为最低的行,因为file_id是auto inc主键。
我可以假设我总是会在files
中获得最低的file_id行吗?这就是我首先使用MIN(files.file_id)
的全部原因,但现在我想知道它是否是必要的,因为它是一个auto inc主键。这也假设我在下面的声明中也没有传递任何ORDER BY条件。我仍然会觉得更安全,知道'将始终返回右行。
$stmt = $db->prepare("
SELECT
accounts.account_id,
accounts.account_username,
accounts.account_password,
computers.computer_id,
users.user_id,
files.file_id,
files.filename,
files.timestamp
FROM accounts
LEFT JOIN computers
on computers.account_id = accounts.account_id
LEFT JOIN users
on users.computer_id = computers.computer_id
LEFT JOIN files
on files.user_id = users.user_id
WHERE
accounts.account_id = :account_id and
computers.computer_name = :computer_name and
users.username = :username
");