我试图从1个表中的1列中获取信息,这是基于从1个单一SELECT语句中的另一个表中的另一个列中检索到的信息,同时执行任务以简化我的代码和/或
我有2张桌子
视频
------------------------------
| id | date | userID | ... |
------------------------------
| 1 | <date> | 1 | |
------------------------------
| 2 | <date> | 5 | |
------------------------------
| 3 | <date> | 1 | |
------------------------------
| 4 | <date> | 2 | |
------------------------------
| 5 | <date> | 2 | |
------------------------------
.
.
.
------------------------------
| n | | user-n | |
------------------------------
(id为1的视频由下表中ID为1的用户上传)
(id为2的视频由id为5的用户上传)
(id为3的视频由id为1的用户上传)
等
用户信息
-----------------------------
| id | ... | username | ... |
-----------------------------
| 1 | | Bob | |
-----------------------------
| 2 | | Alice | |
-----------------------------
| 3 | | Ned | |
-----------------------------
| 4 | | Jill | |
-----------------------------
| 5 | | John | |
-----------------------------
.
.
.
-----------------------------
| n | | name-n | |
-----------------------------
(id为1的用户有用户名Bob)
(id为2的用户有用户名Alice)
等
我需要的是从按日期排序的8个最新视频中获取用户名
因此,如果按日期订购后的视频顺序为
视频5
视频1
视频3
视频4
视频2
。
。
我想按顺序获取上传者的用户名
所以在这种情况下,结果应该是
Alice(用户上传的视频ID 5,ID为2 = Alice)
Bob(视频ID 1由用户上传,ID为1 = Bob)
Bob(用户上传的视频ID 3,ID为1 = Bob)
爱丽丝......
约翰。
。
。
connection.php
try {
$servername = "localhost";
$username = "*****";
$password = "*********";
$database = "****";
$charset = 'utf8';
$dsn = "mysql:host=$servername;dbname=$database;charset=$charset";
$opt = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
];
$pdo = new PDO ( $dsn , $username , $password , $opt );
} catch ( PDOException $e ) {
file_put_contents ( 'PDOError.txt', $e->getMessage(), FILE_APPEND );
echo "Failed to connect to database!";
die ();
}
有效的代码,但是很麻烦
的functions.php
try {
$prepareVideo = $pdo->prepare( "SELECT userID FROM video WHERE 1 ORDER BY date DESC LIMIT 8" );
$prepareVideo->execute([]);
$geVideo = $prepareVideo->fetchAll();
} catch ( PDOException $e ) {
file_put_contents ( 'error.txt', $e->getMessage(), FILE_APPEND );
}
if ( $geVideo ) {
foreach ( $geVideo as $row ) {
$userID = $row['userID'];
try {
$prepareUser = $pdo->prepare( "SELECT username FROM userinfo WHERE id = ? LIMIT 1" );
$prepareUser->execute([$userID]);
$getUser = $prepareUser->fetch();
} catch ( PDOException $e ) {
file_put_contents ( 'error.txt', $e->getMessage(), FILE_APPEND );
}
if ( $getUser ) {
$username[] = $getUser['username'];
}
}
}
但这可以通过很多代码实现这个
我想要做的是与上面相同,但只在一个单一的SELECT语句中,如
的functions.php
try {
$prepareUsername = $pdo->prepare( "SELECT..." );
$prepareUsername->execute([]);
$getUsername = $prepareUsername->fetch();
} catch ( PDOException $e ) {
file_put_contents ( 'error.txt', $e->getMessage(), FILE_APPEND );
}
if ( $getUsername ) {
$username[] = $getUsername['username'];
}
插入与上述相同的单个SELECT语句
到目前为止我尝试了什么
SELECT u.username FROM userinfo u WHERE u.id IN ( SELECT v.userID FROM video v )
但只列出了已上传视频的用户名
在这种情况下,3个名称按其在userinfo表中的id的顺序
鲍勃
爱丽丝
约翰
这不是我想要的
希望有人可以提供帮助
答案 0 :(得分:1)
在加入video
时,以正确的顺序从userinfo
中选择。
E.g:
SELECT v.id AS videoID, u.username
FROM video AS v
JOIN userinfo AS u ON v.userID = u.id -- or left join, if user might not exist
ORDER BY v.uploadedAt DESC