Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/252.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 mysql按状态列出rep,rep表中没有多行_Php_Mysql_Join - Fatal编程技术网

php mysql按状态列出rep,rep表中没有多行

php mysql按状态列出rep,rep表中没有多行,php,mysql,join,Php,Mysql,Join,我有一个问题,我一直无法有效地解决。我需要为美国50个州中的每个州动态生成一个代表列表。每个州的代表数量可变,等于一个或多个,并且会波动。每个代表可能出现在多个状态中。为了使事情更加复杂,几个州被划分为非标准区域(如“北部”、“北部”、“中部”等),但并非所有州的命名都一致。最终的产品将产生一系列的表格,类似于在 现在,我设想两个数据库表: **StateTable_example1** state_id | state_name | state_reps MI M

我有一个问题,我一直无法有效地解决。我需要为美国50个州中的每个州动态生成一个代表列表。每个州的代表数量可变,等于一个或多个,并且会波动。每个代表可能出现在多个状态中。为了使事情更加复杂,几个州被划分为非标准区域(如“北部”、“北部”、“中部”等),但并非所有州的命名都一致。最终的产品将产生一系列的表格,类似于在

现在,我设想两个数据库表:

**StateTable_example1**
state_id  |  state_name  |  state_reps
MI            Michigan       1,2,3,4
OH            Ohio           3,4,5,6,7
IN            Indiana        2,4,5

**RepTable_example1**
rep_id  |  rep_fname  |  replname  |  (more columns not relevant here)
1          John          Smith
2          Jane          Doe
etc.
我必须处理区域数据的一个想法是在StateTable.state_reps列中添加额外的数据,类似这样:

**StateTable_example2**
state_id  |  state_name  |  state_reps
MI            Michigan       1-Upper Peninsula,2-Lower Peninsula,3-Western
OH            Ohio           3-Northern,4-Southern
IN            Indiana        2-Northern,4-Eastern,5-Western
**StateTable_example3**
state_id  |  state_name  |  state_reps
MI            Michigan       1,2,3
OH            Ohio           4,5
IN            Indiana        6,7,8

**RepTable_example3**
rep_id  |  rep_region  |  rep_fname  |  replname  |  (more columns not relevant here)
1          Upper Peninsula   John          Smith
2          Lower Peninsula   Jane          Doe
3          Western           Tom           Jones
4          Northern          Tom           Jones
5          Southern          Amy           Wong
6          Northern          Jane          Doe
7          Eastern           Amy           Wong
8          Western           Jim           Johnson
这将允许每个代表在RepTable中有一行,同时仍然允许区域差异。。。这将是伟大的更新,如电话号码,电子邮件,传真号码等可报告的数据。。。但是我不能开始思考如何在php/mysql中编写一个查询来有效地处理这个问题

我的另一个想法是在RepTable中添加一列来处理区域,然后如果每个rep的位置处于多个状态,那么每个rep都有多行。。。像这样:

**StateTable_example2**
state_id  |  state_name  |  state_reps
MI            Michigan       1-Upper Peninsula,2-Lower Peninsula,3-Western
OH            Ohio           3-Northern,4-Southern
IN            Indiana        2-Northern,4-Eastern,5-Western
**StateTable_example3**
state_id  |  state_name  |  state_reps
MI            Michigan       1,2,3
OH            Ohio           4,5
IN            Indiana        6,7,8

**RepTable_example3**
rep_id  |  rep_region  |  rep_fname  |  replname  |  (more columns not relevant here)
1          Upper Peninsula   John          Smith
2          Lower Peninsula   Jane          Doe
3          Western           Tom           Jones
4          Northern          Tom           Jones
5          Southern          Amy           Wong
6          Northern          Jane          Doe
7          Eastern           Amy           Wong
8          Western           Jim           Johnson
我认为这个方法的php/mysql语句会更简洁,但是当每个rep由多行表示时,就会出现更新rep信息(频繁更改)的问题

我考虑了第三个表格,将代表映射到各州,但我不知道如何做到这一点,以允许每个代表具有不同的地区(例如,在上述数据中,艾米·王的地区在俄亥俄州为“南部”,而在印第安纳州为“东部”)

有人知道一种不需要多次调用数据库就能高效完成此任务的方法吗?任何帮助都将不胜感激

*****编辑****最终输出虽然类似于上面链接中的表格,但实际上将用作另一个脚本的输入,并以图形方式映射代表。表格数据将成为工具提示。实际的最终输出将如下所示:(但有更多的区域数据,这是目前所缺乏的)


*****编辑_2****为了澄清,我重命名了我的示例表格。

以下是表格的内容:

Rep
---
rep_id
fname
lname  

State
----------
state_code
name

Region
----------
region_code
name
state_code (fk)

RepRegion
---------
region_code
rep_id
仅根据您的报表规范,类似这样的查询应该非常接近您所需要的内容——非常标准的联接和order by,以便按您想要的顺序列出内容

实现这一点的唯一诀窍是,对于需要它的每个州,都应该有一个“ALL”或“NONE”区域,或者可以包含一个名为“noRegion”之类的tinyint标志,默认值为0。换句话说,每个州至少需要一个区域,即使该州没有区域。如果州没有区域,或者有区域和代表,但也有未绑定到特定区域的代表,则仅需要“全部/无”区域

对于跨区域、州或任何组合的代表,您需要为该代表设置一个RepRegion行

不属于某个地区的代表将被指定为该地区的代表,因为他们属于这些特殊的“无地区”地区之一

当然,这是一个结果集,因此您的报告假定使用一些程序产品来处理格式,并理解何时按州添加新的节标题,或按地区添加子标题

在这一点上,您可以从RepRegion加入到Rep&State,您将很容易在示例中创建报告

SELECT rr.*, rp.*, re.*, s.*
FROM RepRegion rr
JOIN Rep rp ON (rp.rep_id = rr.rep_id)
JOIN Region re ON (re.region_code = rr.region_code)
JOIN State s ON (s.state_code = re.state_code)
ORDER BY s.name, r.name, rp.lname, rp.fname

按如下方式规范化数据。
StateTable
仅包含每个状态的信息:

state_id  |  state_name
MI            Michigan
OH            Ohio
IN            Indiana
RepTable
表格可以保持原样。最后,创建一个新的连接表
StateToRepTable
,它将状态与其各个代表关联:

state_id  |  state_reps
MI           1
MI           2
MI           3
MI           4
OH           3
...          ...

在当前的
StateRep
表中避免使用CSV数据的动机是CSV数据使连接变得困难。MySQL实际上提供了一个函数,
FIND_IN_SET()
,它可以部分缓解这个问题,但它是有限的。此外,维护和更新CSV列表容易出错,也不容易。通过在一条单独的记录上获取每个状态代表,我们可以让数据库实现它的目的:对多组记录进行操作。

您的
StateTable
表的设计很糟糕,因为reps列是CSV。不要那样做!蒂姆,谢谢你指出这一点,但是你有更好的方法的建议吗?你是说任何类型的内爆数组都是不好的,还是说有一个比逗号更好的分隔符?如果一个内爆的数组是坏的,那么我应该怎么做——某种第三个表来映射东西?如果是这样,那将如何处理不同的区域数据呢?谢谢Tim。我可以看到这是如何工作的,但是否有更好的方法,以一种不需要在RepTable中每个rep超过一行的方式处理区域数据?从您的原始数据中,我在
RepTable
中只看到每行一个rep。如果您参考的是我建议的连接表,则无法将每个代表的所有关系存储在单独的一行中,除非您希望对数据库进行非规范化,这是一种糟糕的设计。感谢您添加有关FIND_IN_SET()函数的信息。我会尽量采纳您的建议,避免使用CSV数据,但如果我没有其他选择,我很高兴知道还有一个选择。@EricBrockway需要说明的是,
FIND_IN_SET()
仅适用于连接的一侧,即,您可以使用代表ID并搜索代表的CSV列表。但是你不能以另一种方式加入。谢谢你的观点,这看起来可以处理一切。然而,我正跌跌撞撞地想象这个查询。您能否提供一个以正确方式连接这四个表的查询示例?请从RepRegion表的select开始。从这里,连接到Region和Rep。这些都是标准的内部连接,所以您不需要左连接。最后从R添加一个连接