选择所有左侧 Table 列和特定右侧 Table 列时输出 MySQL 左连接 PHP
Outputting a MySQL Left Join In PHP When Selecting All of The Left Table Columns And Specific Right Table Columns
我有一个 'imageposts' table,我正在用 'users' table 做一个 left join
这样如果有图像 post 它为完成该相关图像的用户获取数据 post。
两个table链接是因为'imageposts'中的'user_id'列table是'id'列中的外键'users' table.
尽管下面的代码有效,但当存在图像 post 时,它当前会使用 MySQL 查询从 'users' table 中提取所有字段(总共 12 列)而我只使用了其中的 2 列(名字和姓氏),这似乎过多/不是最佳解决方案?
我正在尝试研究如何只从 'users' 中提取两个字段(名字和姓氏),同时从 'imageposts' table?[=16 中选择所有内容=]
非常感谢任何帮助。
<?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 } ?>
您可以做的第一件事是从 table 和 select 或
中定义您想要的所有列名称
<?php
query("select IP.col1 ,IP.col2 ,U.col3 FROM imageposts IP inner join users U on IP.user_id = U.id")
?>
这种方式 mysql 只会 return 来自 selected 列的值,这是有效的
你可以做的另一件事是为用户 table 和 select 创建一个单独的视图,只有你想要的两列,然后在内部加入该视图与你的图像帖子
如果你想 select 全部使用第一个 table 中的 *
,而第二个 table 中只使用 select 几列,你可以为 table 起别名,然后使用 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
;
I have an 'imageposts' table that I am doing a left join with a
'users' table so that if there is an image post it fetches the data
for the user who has done that related image post.
我知道你的查询使用的是 inner join 而不是 left join 但我只是想指出区别,因为你的评论意味着误解。 inner join 要求两个 table 中的数据都存在。如果在连接 table 中未找到匹配行,则主 table 中的行将不会包含在结果集中。 left join 类似,但仍然会从您的主 table 获取 return 数据,即使在您的连接 table 中没有找到匹配的行。来自已连接 table 的值将简单地为空。
因此,如果您在示例中使用 left join 并且 post #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 JOIN 而不是 LEFT JOIN。
这将让您仅显示来自用户的 3 个值 table,如果您需要显示更多,则需要在查询中添加它们。
SELECT imgp.*, users.id, users.firstname, users.lastname
FROM imageposts AS imgp
LEFT JOIN users ON imgp.user_id = users.id
我有一个 'imageposts' table,我正在用 'users' table 做一个 left join
这样如果有图像 post 它为完成该相关图像的用户获取数据 post。
两个table链接是因为'imageposts'中的'user_id'列table是'id'列中的外键'users' table.
尽管下面的代码有效,但当存在图像 post 时,它当前会使用 MySQL 查询从 'users' table 中提取所有字段(总共 12 列)而我只使用了其中的 2 列(名字和姓氏),这似乎过多/不是最佳解决方案?
我正在尝试研究如何只从 'users' 中提取两个字段(名字和姓氏),同时从 'imageposts' table?[=16 中选择所有内容=]
非常感谢任何帮助。
<?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 } ?>
您可以做的第一件事是从 table 和 select 或
中定义您想要的所有列名称<?php
query("select IP.col1 ,IP.col2 ,U.col3 FROM imageposts IP inner join users U on IP.user_id = U.id")
?>
这种方式 mysql 只会 return 来自 selected 列的值,这是有效的 你可以做的另一件事是为用户 table 和 select 创建一个单独的视图,只有你想要的两列,然后在内部加入该视图与你的图像帖子
如果你想 select 全部使用第一个 table 中的 *
,而第二个 table 中只使用 select 几列,你可以为 table 起别名,然后使用 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
;
I have an 'imageposts' table that I am doing a left join with a 'users' table so that if there is an image post it fetches the data for the user who has done that related image post.
我知道你的查询使用的是 inner join 而不是 left join 但我只是想指出区别,因为你的评论意味着误解。 inner join 要求两个 table 中的数据都存在。如果在连接 table 中未找到匹配行,则主 table 中的行将不会包含在结果集中。 left join 类似,但仍然会从您的主 table 获取 return 数据,即使在您的连接 table 中没有找到匹配的行。来自已连接 table 的值将简单地为空。
因此,如果您在示例中使用 left join 并且 post #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 JOIN 而不是 LEFT JOIN。
这将让您仅显示来自用户的 3 个值 table,如果您需要显示更多,则需要在查询中添加它们。
SELECT imgp.*, users.id, users.firstname, users.lastname
FROM imageposts AS imgp
LEFT JOIN users ON imgp.user_id = users.id