Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php SQL连接没有按我需要的方式工作_Php_Sql_Join - Fatal编程技术网

Php SQL连接没有按我需要的方式工作

Php SQL连接没有按我需要的方式工作,php,sql,join,Php,Sql,Join,嗨,伙计们,我对SQL join语句有问题。我似乎不能让它按我想要的方式工作 ex. TABLE1 TABLE 2 ID NAME ID INFO 1 JOE 1 YES 2 MIKE 1 NO 3 JESS 1 MAYBE 4 ROB 2 NO 2 NO $stid=oci\u parse($conn,” 从表1 TBL1中选择

嗨,伙计们,我对SQL join语句有问题。我似乎不能让它按我想要的方式工作

ex.
TABLE1          TABLE 2 
ID  NAME        ID  INFO
1   JOE         1   YES
2   MIKE        1   NO
3   JESS        1   MAYBE
4   ROB         2   NO
                2   NO
$stid=oci\u parse($conn,”
从表1 TBL1中选择*右连接表2 TBL2
ON(TBL1.ID=TBL2.ID0,其中TBL1.ID='1'
");
保监处执行($stid);
while($row=oci\u fetch\u数组($stid,oci\u BOTH+oci\u RETURN\u NULLS))!=false){
echo$row['NAME']。“
”; echo$row['INFO']。“
”; }
我想看到的是

RESULT

JOE
YES
NO
MAYBE
通常我得到的(不管连接类型)是

JOE
YES
JOE
NO
JOE
MAYBE

任何帮助都很好。

不要使用rigth join,将其更改为left join

SELECT * FROM TABLE1 TBL1 LEFT JOIN TABLE2 TBL2 
ON (TBL1.ID = TBL2.ID) WHERE TBL1.ID = '1'

首先,您需要将右连接更改为左连接(或简单连接,请检查您的要求)。现在,对于问题的主要部分:连接按预期工作,您需要使用您喜爱的语言来执行类似操作:

伪代码

var test_name = "";
var last_name = "";
while EXIST_MORE_RECORDS {
  test_name = $row['NAME'];
  if (test_name != last_name) {
    last_name = test_name;
    print last_name;
  }
  print $row['INFO']."<br/ >";
}
var测试_name=”“;
var last_name=“”;
当存在更多记录时{
test_name=$row['name'];
if(测试名称!=姓氏){
last_name=测试名称;
打印姓氏;
}
打印$row['INFO']。“
”; }
查看查询结果:

+----+------+----+-------+
| ID | NAME | ID | INFO  |
+----+------+----+-------+
|  1 | JOE  |  1 | MAYBE |
|  1 | JOE  |  1 | NO    |
|  1 | JOE  |  1 | YES   |
+----+------+----+-------+
现在看看你的循环。你正在为每一行输出
NAME
INFO
。你可以像@giorgos altanis建议的那样改变你的循环

您还可以将查询更改为使用
UNION
,并分别抓取
名称
信息
,以便每个都是自己的行

select Name VALUE, 0 sortorder
from TABLE1 
where ID = '1'
union
select Info VALUE, 1 sortorder
from TABLE2
where ID = '1'
order by sortorder
这将为您提供如下结果:

+-------+-----------+
| VALUE | sortorder |
+-------+-----------+
| JOE   |         0 |
| MAYBE |         1 |
| NO    |         1 |
| YES   |         1 |
+-------+-----------+
然后你可以使用一个简单的循环。很难说这是否适合你的实际代码

请注意,无法保证表2中的行的顺序。如果希望它们按是、否、可能的顺序显示,则需要在表中添加一个字段来定义排序顺序(或者可能是一个
CASE
语句)

更新

如果您想要的只是表2中的行数(这是一个完全不同的问题),那么您只需要加入表,然后在
名称上分组:

select TBL1.ID, TBL1.NAME, COUNT(1) TBL2COUNT
from TABLE1 TBL1
join TABLE2 TBL2 on TBL1.ID = TBL2.ID
where TBL1.ID = '1'
group by tbl1.ID, TBL1.NAME

从哪里来
ID0
?,或者说sql server尖叫:sql语法没有按我需要的方式工作,请先修复它。这就是你将得到的-因为连接就是这样工作的。顺便说一下,右连接是一个内部连接,实际上是你使用它的方式。这不是实际的代码。我只是为这个示例创建它。让我们假设没有syntax错误。我可以用连接来说明我想要的吗?当然,将右连接误认为左连接不是语法错误,这是一个逻辑错误,对澄清您的问题没有多大帮助。无论如何,由于您的问题可能无关紧要,我尝试根据您提供的预期输出来回答。老实说,我实际上是这样做的代码要做的就是COUNT()从表2返回的行数并显示计数。(例如JOE COUNT INFO 3)谢谢-为什么计数(1)?1引用的是什么?谢谢你的帮助1只是一个非空表达式。你也可以使用
COUNT(*)
COUNT(TBL2.ID)
。你可以在这个网站上搜索计数(1)vs COUNT(*)以了解比您可能关心的更多的信息。