尝试从1个表中的1列中获取信息,该信息基于从单个SELECT语句中的另一个表中的另一列检索的信息

时间:2017-11-09 14:24:59

标签: php mysql

我试图从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的顺序 鲍勃
爱丽丝
约翰

这不是我想要的

希望有人可以提供帮助

1 个答案:

答案 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

演示:https://www.db-fiddle.com/f/quQZ9Cnx14exk4BHqD5sEV/2