gpt4 book ai didi

php - 如何在一个 MySQL 查询中选择 2 个连接表?

转载 作者:太空宇宙 更新时间:2023-11-03 10:32:47 25 4
gpt4 key购买 nike

我有 1 个主表和 2 个子表。我想将 3 列连接在一起(但问题是 2 个子表没有任何共享相同值的列),然后基于 2 个子表中的 2 个不同列来选择 *。

我搜索并尝试了多种编码方式,但找不到解决方案。

SELECT *
FROM (master INNER JOIN sub_1 ON master.id=sub_1.id WHERE sub_1.column_1 = 'Y')
AND (master INNER JOIN sub_2 ON master.id=sub_2.id WHERE sub_2.column_2 = 'Y')
ORDER BY master.id

++++++++++++++++++++++++++++++++++++++++++++++++++++
* 终于解决了。请参阅本文底部的解决方案。 *++++++++++++++++++++++++++++++++++++++++++++++++++++

===========

编辑:解释更多关于我的数据、问题和MySQL代码

我在 MySQL 中存储了 3 个表,如下所示

Master_table: regist
------------------------------------------
| reg_no | firstname | lastname | submit |
------------------------------------------
| 1 | first_A | last_A | N |
| 2 | first_B | last_B | A |
| 3 | first_C | last_C | P |
| 4 | first_D | last_D | P |
| 5 | first_E | last_E | A |
| 6 | first_F | last_F | N |
| 7 | first_G | last_G | N |
| 8 | first_H | last_H | A |
------------------------------------------

Sub_1: sub_A Sub_2: sub_P
------------------------------ ------------------------------
| reg_no | A_title | reply_A | | reg_no | P_title | reply_P |
------------------------------ ------------------------------
| 2 | 222 | Y | | 3 | 333 | N |
| 5 | 555 | N | | 4 | 444 | Y |
| 8 | 888 | Y | ------------------------------
------------------------------

我想创建一个给出这样结果的查询

----------------------------------------------------------------------------------
| reg_no | firstname | lastname | submit | A_title | reply_A | P_title | reply_P |
----------------------------------------------------------------------------------
| 2 | first_B | last_B | A | 222 | Y | | |
| 8 | first_H | last_H | A | 888 | Y | | |
| 4 | first_D | last_D | P | | | 444 | Y |
----------------------------------------------------------------------------------

or

-----------------------------------------------------------
| reg_no | firstname | lastname | submit | title | reply |
-----------------------------------------------------------
| 2 | first_B | last_B | A | 222 | Y |
| 8 | first_H | last_H | A | 888 | Y |
| 4 | first_D | last_D | P | 444 | Y |
-----------------------------------------------------------

$sql = "SELECT *
FROM (regist INNER JOIN sub_A ON regist.reg_no = sub_A.reg_no WHERE sub_A.reply_A = 'Y')
AND (regist INNER JOIN sub_P ON regist.reg_no = sub_P.reg_no WHERE sub_P.reply_P = 'Y')
ORDER BY regist.reg_no";

预期结果:ECHO 回复'Y'的所有注册者的个人资料

if($row['submit']=="A") $title = $row['A_title'];
elseif($row['submit']=="P") $title = $row['P_title'];

$result = mysql_query($sql) or die(mysql_error());
while($row = mysql_fetch_array($result))
{
echo $row['reg_no']." / ".$row['firstname']." ".$row['lastname']." / ".$title."<br>";
}

问题:我的 SELECT 代码出错。来自@GMB 和@Rogue 的代码没有错误,但 echo 什么也没给出。

如果无法按照我的意愿编写查询代码,我将修改列名称(sub_1.reply_A 和 sub_2.reply_P)相同,并更改其他网页中的输入代码。但是,最好有办法,因为我不知道其他地方是否使用了“回复”列。

========================

解决方案:对@Rogue代码稍作修改

SELECT *
FROM master
LEFT OUTER JOIN sub_1
ON master.id=sub_1.id
LEFT OUTER JOIN sub_2
ON master.id=sub_2.id
WHERE sub_1.column_1 = 'Y'
OR sub_2.column_2 = 'Y'
ORDER BY master.id

最佳答案

您是否只想在这 3 个表之间进行简单的JOIN

SELECT m.*, s1.*, s2.*
FROM master m
INNER JOIN sub_1 s1 ON m.id=s1.id AND s1.column_1 = 'Y'
INNER JOIN sub_2 s2 ON m.id=s2.id AND s2.column_2 = 'Y'
ORDER BY m.id;

如果您的主记录可能不存在于两个子表中,您可以切换到 LEFT JOIN 以避免将它们过滤掉。

指南:

  • 典型语法是 SELECT ... FROM table1 INNER JOIN table2 ON ... INNER JOIN table3 ON...
  • 最好将与 JOIN 表相关的所有条件放在连接的 ON 子句中,而不是放在 WHERE 子句中
  • 避免 SELECT * :具体说明您要选择的列
  • 使用表别名使查询更易于阅读

关于php - 如何在一个 MySQL 查询中选择 2 个连接表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54575795/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com