多表链接问题

#1 ivanlai

求jake 或者其他大神 帮忙看看问题!
先说说背景情况吧!
为了学习PHP,已经Speedphp,就打算写一个同事之间请客吃饭的一个记录程序!
一共有4张表,
mysql> show tables;
+----------------------+
| mangroup            //被请吃饭的人员组合
| people                 //人员信息
| restaurant           //吃饭的地点信息
| watermain            //总的流水账
+----------------------+
使用mysql的查询语句如下:
select watermain.autoid,watermain.dinnerdate,people.name,mangroup.member, watermain.howmuch,restaurant.name,watermain.detail from watermain,people,mangroup,restaurant where (watermain.cheersman=people.autoid) and (watermain.persongroup=mangroup.autoid) and (watermain.dinnerplace=restaurant.id) order by watermain.dinnerdate desc;

结果期望如下:
autoid | dinnerdate | name      | member      | howmuch | name                    | detail                                                             |
|     29 | 2013-05-30 | 孙琳      | 来+琳+姚    |   75.00 | 面鼎香                  | 泡馍+粥+大拌菜                                                     
|     28 | 2013-05-29 | 来鹏      | 来+琳+姚    |   78.00 | 面鼎香                  | 面+大拌菜   

问题1:
我也看了关于1对1,一对多,多对多的关系,但是感觉这个当表很多时,用起来很复杂,对于初学者很痛苦,又没有更好的办法?


问题2:
后来我就决定采用findsql,代码如下

     $sql="select watermain.autoid,watermain.dinnerdate,people.name,mangroup.member,
       watermain.howmuch,restaurant.name,watermain.detail
       from watermain,people,mangroup,restaurant
       where (watermain.cheersman=people.autoid)
       and (watermain.persongroup=mangroup.autoid)
       and (watermain.dinnerplace=restaurant.id) order by watermain.dinnerdate desc";


               $watermain = spClass("m_watermain");               
               $this -> results = $watermain ->findsql($sql);
               dump($this -> results);
        $this -> display("showall.html");

结果出来的数据和我期望的不同:少了部分的数据
0] => Array        (            [autoid] => 29            [dinnerdate] => 2013-05-30            [name] => 面鼎香            [member] => 来+琳+姚            [howmuch] => 75.00            [detail] => 泡馍+粥+大拌菜        )    [1] => Array        (            [autoid] => 28            [dinnerdate] => 2013-05-29            [name] => 面鼎香            [member] => 来+琳+姚            [howmuch] => 78.00            [detail] => 面+大拌菜        )导致最后的显示有空值! smarty模板输出
QQ截图20130602004506.jpgQQ截图20130602004506.jpg
我就找原因,修给了 driver/mysql.php 中的 getarray函数!
去掉了MYSQL_ASSOC          while($rows[] = mysql_fetch_array($result)){}
调试的数据如下:
0] => Array        (            [0] => 29            [autoid] => 29            [1] => 2013-05-30            [dinnerdate] => 2013-05-30            [2] => 孙琳            [name] => 面鼎香            [3] => 来+琳+姚            [member] => 来+琳+姚            [4] => 75.00            [howmuch] => 75.00            [5] => 面鼎香            [6] => 泡馍+粥+大拌菜            [detail] => 泡馍+粥+大拌菜        )
数组构成的数据是没有问题的,但是字段的就有问题!
所以问题2:为什么输出有问题了,我的程序哪里有问题了,求解答!

问题3:
为什么 while($rows[] = mysql_fetch_array($result,MYSQL_ASSOC)){} 不使用both呢,那样既可以兼容数组,也可以兼容字段,当时是基于什么原因考虑的!性能吗?


2013-06-02 00:53:02

#2 jake

1. SP的关联已经很简单了,初学者都能懂。看你这种SQL,很明显是建表逻辑有问题,没什么好说的。

2. SQL里面select的字段名重复了。建议用as来更换名称。

3. 正常来说你是可以任意写程序,但是,SP框架更希望是按照一定逻辑来写,“兼容数组,也可以兼容字段”虽然很“方便”,怎么写SQL都行,写出来谁也乱七八糟、理不清逻辑都能执行,但是SP框架是不建议这样写,SP更希望在同一次查询出来的数据中,不同的字段名可以明确标识不同的数据,而不是0,1,2,3的name然后靠猜。这就是初衷。

2013-06-02 08:26:25

#3 ivanlai

谢谢jake指点!再研究一下,数据库!

2013-06-02 19:35:41