【问题标题】:Outputting a MySQL Left Join In PHP When Selecting All of The Left Table Columns And Specific Right Table Columns选择所有左表列和特定右表列时在 PHP 中输​​出 MySQL 左连接
【发布时间】:2021-09-17 00:39:13
【问题描述】:

我有一个 'imageposts' 表,我正在使用一个 'users' 表创建一个 left join,这样如果有一个图像帖子,它就会为完成该相关图像帖子的用户获取数据。

这两个表是链接的,因为“imageposts”表中的“user_id”列是“users”表中“id”列的外键。

虽然下面的代码有效,但当有图片发布时,它当前会使用 MySQL 查询(总共 12 列)从“用户”表中提取所有字段,而我只使用其中 2 列(名字和姓氏),这似乎过度/不是最好的解决方案?

我正在尝试解决如何只从“用户”中提取两个字段(名字和姓氏),同时从“图像帖子”表中选择所有内容?

非常感谢任何帮助。

<?php

    $stmt = $connection->query("SELECT * FROM imageposts left join users on imageposts.user_id = users.id");

    while ($row = $stmt->fetch()) {

        // from imageposts table (every column in the table is used)
        $db_image_id = htmlspecialchars($row['image_id']);
        $db_image_title = htmlspecialchars($row['image_title']);
        $db_image_tags = htmlspecialchars($row['image_tags']);
        $db_image_filename = htmlspecialchars($row['filename']);
        $db_ext = htmlspecialchars($row['file_extension']);
        $db_processed= htmlspecialchars($row['user_processed']);
        $db_username = htmlspecialchars($row['username']);
        $db_profile_image_filename = htmlspecialchars($row['profile_image']);

        // from users table (only 2 of the 12 columns returned in the query are used)
        $db_firstname = htmlspecialchars($row['firstname']);
        $db_lastname = htmlspecialchars($row['lastname']);

    ?>

    <figure>
        <!-- HMTL output goes here including the above variables  -->
    </figure>

<?php } ?>

【问题讨论】:

  • 只需列出imagepost 中的所有列,加上SELECTusers 表中的firstnamelastname。这也适用SELECT imagepost.*, users.firstname, users.lastname FROM ...,但最好指定所有你想要的列

标签: php mysql database left-join


【解决方案1】:

如果您想从第一个表中选择所有使用 * 的列,并且只从第二个表中选择几个列,您可以为这两个表设置别名,然后使用 alias_a.*alias_b.column_1, alias_b.column_2

例如

SELECT pst.*, usr.firstname, usr.lastname 
FROM imageposts pst 
INNER JOIN users usr on pst.user_id = usr.id
;

我有一个“imageposts”表,我正在用一个左连接 'users' 表,以便如果有图片发布,它会获取数据 对于发布了相关图片帖子的用户。

我意识到您的查询使用的是 inner join 而不是 left join,但我只是想指出其中的区别,因为您的评论意味着误解。 内连接要求两个表中的数据都存在。如果在连接表中未找到匹配行,则主表中的行将不包含在结果集中。 left join 类似,但即使在连接的表中找不到匹配的行,仍会从主表返回数据。连接表中的值将简单地为空。

因此,如果您在示例中使用 left join 并且帖子 #1 没有关联用户,您最终会得到类似的结果,

SELECT pst.*, usr.firstname, usr.lastname 
FROM imageposts pst 
LEFT JOIN users usr on pst.user_id = usr.id
;
image_id image_title ... firstname lastname
1 profile_1 ... null null
2 profile_2 ... tony martron

但是内连接会是,

image_id image_title ... firstname lastname
2 profile_2 ... tony martron

【讨论】:

  • 很抱歉这是一个错字。代码应该说是左连接。我已经相应地修改了问题。
  • 关于我的上一条评论。那我实际上应该使用内部联接吗?为混乱道歉。
  • 如果要返回两个表中匹配的所有行,请使用 inner。当您想要 A 中的所有行以及 B 中的任何公共行时,请使用 left
  • 为了简单起见,如果您的应用程序要求所有帖子都由用户创建,那么您将始终拥有从帖子到用户的链接,对吧?在这种情况下,请使用内部连接。这是大多数情况下的默认情况。但是,如果您的应用程序允许没有用户 ID 的客人创建帖子(即,如果 post.user_id 可以为空),那么无论用户是否存在,都使用左连接来检索帖子及其用户。如果您认为这是对您问题的最佳答案,请不要忘记将答案标记为“已接受”。
  • 首选样式。为了可读性,我通常会写尽可能少的关键字。前任。我通常只写JOIN 而不是INNER JOIN,因为如果您不指定连接类型,则内部连接是默认连接。
【解决方案2】:

您可以做的第一件事是在选择器的两个表中定义您想要的所有列名

<?php 
    query("select IP.col1 ,IP.col2 ,U.col3 FROM imageposts IP inner join users U on IP.user_id = U.id")
?>

这种方式mysql只会从选定的列中返回值,这是有效的 您可以做的另一件事是为用户表创建一个单独的视图,然后只选择您想要的两列,然后将该视图与您的图片帖子进行内部连接

【讨论】:

    【解决方案3】:

    您使用的是 INNER JOIN 而不是 LEFT JOIN。

    这将使您仅显示用户表中的 3 个值,如果您需要显示更多,则需要在查询中添加它们。

    SELECT imgp.*, users.id, users.firstname, users.lastname
    FROM imageposts AS imgp
    LEFT JOIN users ON imgp.user_id = users.id
    

    【讨论】:

    • 对不起,这是一个错字,我在我的代码中使用了 LEFT JOIN。将修改问题
    • 在这种情况下使用左连接还是内连接更好?我的代码示例中的错字显然令人困惑,但现在已对其进行了修改。
    • 这取决于你需要什么来更好地理解stackoverflow.com/a/28719292/12232340
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-17
    • 1970-01-01
    • 2013-10-11
    • 2019-05-26
    • 1970-01-01
    • 2020-07-28
    相关资源
    最近更新 更多