SQL JOIN无法正常工作

时间:2017-03-06 15:28:37

标签: php sql join

嗨,大家好我的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

任何帮助都会很棒。

3 个答案:

答案 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   |
+----+------+----+-------+

现在看看你的循环。您为每一行输出NAMEINFO。你可以改变你的循环,就像@ giorgos-altanis建议的那样。

您还可以更改查询以使用UNION,并分别抓取NAMEINFO,以便每个都是自己的行。

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