嗨,大家好我的SQL连接语句有问题。我似乎无法按照我想要的方式工作
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_parse($conn, "
SELECT * FROM TABLE1 TBL1 RIGHT JOIN TABLE2 TBL2
ON (TBL1.ID = TBL2.ID0 WHERE TBL1.ID = '1'
");
oci_execute($stid);
while (($row = oci_fetch_array($stid, OCI_BOTH+OCI_RETURN_NULLS)) != false) {
echo $row['NAME']."<br/ >";
echo $row['INFO']."<br/ >";
}
我想看到的是
RESULT
JOE
YES
NO
MAYBE
通常我得到的(无论连接类型)是类似
JOE
YES
JOE
NO
JOE
MAYBE
任何帮助都会很棒。
答案 0 :(得分:0)
请勿使用rigth join,将其更改为左连接
SELECT * FROM TABLE1 TBL1 LEFT JOIN TABLE2 TBL2
ON (TBL1.ID = TBL2.ID) WHERE TBL1.ID = '1'
答案 1 :(得分:0)
首先,您需要将RIGHT JOIN更改为LEFT JOIN(或简单JOIN,检查您的要求)。现在问题的主要部分:JOIN按预期工作,您需要使用您喜欢的语言来做类似的事情:
<强>伪代码强>
IControllerFactory
答案 2 :(得分:0)
查看查询结果:
+----+------+----+-------+
| ID | NAME | ID | INFO |
+----+------+----+-------+
| 1 | JOE | 1 | MAYBE |
| 1 | JOE | 1 | NO |
| 1 | JOE | 1 | YES |
+----+------+----+-------+
现在看看你的循环。您为每一行输出NAME
和INFO
。你可以改变你的循环,就像@ giorgos-altanis建议的那样。
您还可以更改查询以使用UNION
,并分别抓取NAME
和INFO
,以便每个都是自己的行。
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 |
+-------+-----------+
然后你可以使用一个简单的循环。很难说这是否适合您的实际代码。
请注意,无法保证Table2中的行顺序。如果您希望它们按YES,NO,MAYBE的顺序出现,则表中需要一个额外的字段来定义排序顺序(或者可能是CASE
语句)。
<强>更新强>
如果你想要的只是Table2中的行数(这是一个完全不同的问题),那么你只需要加入表格,然后在NAME
上分组:
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