SQL连接没有重复记录来自一个表

时间:2013-08-01 10:38:19

标签: sql join

您好我正在使用Mysql PHP组合我有3个名为的表
1。学生(填充NameID,名称,百分比)
2。位置(LOCID,地区,州)
3。请参阅(seid,locid,nameid) MANY-TO-MANY 关系,这意味着

学生有很多位置记录以及A位置有很多学生这些关系由Refer表维护,通过指定表ID'(学生,位置)和两个表的记录不应重复

MY TABLES
TABLE-STUDENT

NAMEID - NAME - PERCENT
N1 ---- nameA ------- 70
N2 ----- nameB ------- 63
N3 ----- nameC ------- 45

表 - 位置
LOCID - AREA-- STATE
L1 ------- areaA ---------- P
L2 ------ areaB --------- Q
L3 ------- areaC -------- R

TABLE-REFER
REFERID-- NAMEID-- LOCID
R1 -------- N1 ------ L1
R2 -------- N1 ------ L2
R3 ---------- N2 ------ L1
R4 ---------- N3 ------ L3

实际OUPUT
NAMEID-- NAME-- PERCENT --LOCID-- AREA-- STATE
    N1 ----- nameA ----- 70 ------ L1 ------ areaA-- --- P
    N1 ------ nameA ---- 70 ------- L2 ------ areaB ----- Q 重复学生记录
    N2 ------ nameB ---- 63 ------- L1 ----- areaA ------ P
    N3 ------ nameC ---- 45 ------- L3 ----- areaC ------ R



问题:
当我尝试通过sql join连接三个表时如下所示
选择*来自学生加入请参阅student.nameid = refer.nameid连接位置on location.locid = refer.locid
它显示包含来自学生的重复的记录(如果学生记录连接到来自位置的多个记录)但我只需要具有许多位置记录的唯一学生记录

NAMEID-- NAME - PERCENT-- LOCID-- AREA-- STATE
N1 ----- nameA ----- 70 ------- L1 -------- areaA ---- P
-------------------------------- L2 -------- areaB ---- Q 对于学生 中的重复记录,为NULL N2 ----- nameB -------- 63 -------- L1 -------- areaA ----- P
N3 ------ nameC -------- 45 --------- L3 -------- areaC ----- R
 


NAMEID-- NAME-- PERCENT-- LOCID-- AREA-- STATE --- LOCID2-- AREA2-- STATE2
N1 --------- nameA --- ----- 70 ------ L1 ------- areaA ---- P ---------- --L2 ---------- areaB ------ Q 位置应与学生结合
N2 -------- nameB ---------- 63 ------ L1 ----- areaA ------ P
N3 ------- nameC ----------- 45 ------- L3 ------ areaC ---- R
 

Plz建议我通过SQL语句或PHP代码实现这一点的方法,因为我必须从这个数据报告如

报告:
姓名:nameA
百分比:70
区域1:AREAA
AREA2:areaB
STATE1:P
STATE2:Q
-----------------------------
姓名:nameA
百分比:63
区域1:AREAA
一 STATE1:P


感谢提前

2 个答案:

答案 0 :(得分:1)

这似乎是应用程序本身的工作:

$results = array();
while ($data = $qry->fetch(PDO::FETCH_OBJ))
{
  if (!isset($results[$data->NAME]))
    $results[$data->NAME] = array('percent' => $data->PERCENT, 'areas' => array(), 'states' => array());
  $results[$data->NAME]['areas'][] = $data->AREA;
  $results[$data->NAME]['states'][] = $data->STATE;
}

// parse $results into your report...

答案 1 :(得分:0)

您的问题是关于表示,而不是关于SQL表的关系操作。

以您显示的方式执行JOIN时,这是两个关系连接,结果包含要抑制的复制。关系操作将数据作为一个集合处理,而不是作为一个集合处理。请注意,您没有获得彼此重复的两行。如果表REFER中有重复,你可以得到它。您可以使用SELECT DISTINCT来抑制精确的重复。

清空复制上一行的结果行部分的最佳方法是在报表编写器中执行此操作。