3

嗨,我正在使用 Mysql PHP 组合,我有 3 个名为
1. Student(nameid,name,percent)
2. Location(locid,area,state)
3. Refer(referid,locid,nameid) 的多对多关系的表,这意味着

一个学生有许多位置记录,一个位置也有许多学生,这些关系由引用表维护,方法是同时指定表 ID'S(STUDENT,LOCATION),并且两个表的记录不应重复

MY TABLES
TABLE-STUDENT

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

TABLE -LOCATION
LOCID --AREA-- 状态
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

ACTUAL OUPUT
NAMEID -- 名称-- 百分比 --LOCID-- 区域-- 状态 N1-- 名称 A--
70------L1------区域 A-- ---P
N1- -----nameA----70-------L2-----areaB----- Q Duplicate STUDENT RECORD
N2-----nameB----63-----L1-----areaA------ P
N3-----nameC----45--- ----L3-----区域C------ R



问题:
当我尝试按如下方式通过 sql join 加入三个表时
select * from student join refer on student.nameid=refer.nameid join location on location.locid=refer.locid
它显示的记录包括来自学生的重复记录(如果学生记录连接到来自位置的多个记录)但我只需要具有许多位置记录的唯一学生记录,例如

NAMEID-- NAME-- PERCENT-- LOCID-- AREA-- STATE
N1----- nameA ----- 70-------- L1-------- 区域A---- P
---------------------------- -----L2-------- areaB---- Q NULLfor Student
N2中的重复记录----- nameB--------63-------- L1 -------- areaA----- P
N3-----nameC--------45---------L3--------面积C-----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 请


建议我通过 SQL 语句或 PHP 代码实现此目的的方法,因为我必须从这些数据中进行报告,例如

REPORT:
NAME: nameA
PERCENT:70
AREA1:areaA
AREA2:areaB STATE1
:P
STATE2:Q
-------------------- ---------
名称:nameA
PERCENT:63
AREA1:areaA
a STATE1:P


提前致谢

4

2 回答 2

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...
于 2013-08-01T10:45:42.887 回答
0

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

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

清除与前一行重复的结果行部分的最佳方法是在报告编写器中执行此操作。

于 2013-08-01T11:02:28.723 回答