查询未选择表中的所有行

时间:2015-05-19 21:34:23

标签: php mysql sql join

****** ******** EDIT

Sql fiddle here

****** ******** EDIT

我正在尝试从四个不同的表中加入数据。

本质上,系统流程如下:用户登录并标记其可用性,并将其插入数据库;然后,管理员可以查看在任何给定日期哪些用户可用。对于此特定流程,管理员必须能够看到尚未指定游戏的可用用户。

我知道这可以通过PHP使用大量查询和脚本来实现,但我确信这也可以通过连接来管理。

我现有的查询是:

SELECT
    `availability`.`ref_num`,
    `referee`.`grading`,
    `referee`.`user_number`,
    `user`.`forename`,
    `user`.`surname`,
    `availability`.`availability_num`,
    `availability`.`wk_num`,
    `availability`.`day_num`
FROM `availability`
INNER JOIN referee on availability.ref_num = referee.ref_number
INNER JOIN user on user.user_number = referee.user_number
LEFT JOIN appointments ON 
    (appointments.referee_code = referee.ref_number) AND 
    (appointments.availability_number = availability.availability_num)
WHERE appointments.appointment_number IS null

我目前有四个用户输入我的测试数据库,每个用户都是一个裁判,每个用户都有两个可用日期。但是,上面的查询只返回两行,而不是八行。

返回的数据是:

ref_num  grading  user_number  forename  surname  availability_num  wk_num  day_num
3        5        6            John      Smith    72                20      6
3        5        6            John      Smith    73                21      6

然而,我期待:

ref_num  grading  user_number  forename  surname  availability_num  wk_num  day_num
1        6        3            Bob       Wills    76                20      6
1        6        3            Bob       Wills    77                21      6
2        7        5            Alex      Jones    74                20      6
2        7        5            Alex      Jones    75                21      6
3        5        6            John      Smith    72                20      6
3        5        6            John      Smith    73                21      6
4        8        7            James     Bar      78                20      6
4        8        7            James     Bar      79                21      6

我觉得实际返回的两行是因为这些是availability_num中最低的两个值,但是我无法弄清楚为什么其他表格不是'回来了。

表格结构如下以供参考。关于我出错的地方的一些指导将不胜感激。很抱歉这篇长篇文章,但我想提供我所拥有的所有信息。

`appointments` (
  `appointment_number` int(11),
  `level` int(11) NOT NULL,
  `referee_code` int(11) NOT NULL,
  `role` int(11) NOT NULL,
  `fixture_number` int(11) NOT NULL,
  `availability_number` int(11) NOT NULL,
  `published` int(11) NOT NULL
)

`availability` (
  `availability_num` int(11) NOT NULL,
  `wk_num` int(11) NOT NULL,
  `day_num` int(11) NOT NULL,
  `ref_num` int(11) NOT NULL
)

`referee` (
  `ref_num` int(11) NOT NULL,
  `grading` int(11) NOT NULL,
  `user_number` int(11) NOT NULL
)

`user` (
  `user_number` int(11) unsigned NOT NULL,
  `forename` varchar(50) NOT NULL,
  `surname` varchar(50) NOT NULL,
  `mobile_phone_number` varchar(11) DEFAULT NULL,
  `home_phone_number` varchar(11) DEFAULT NULL,
  `email` varchar(100) NOT NULL,
  `user_name` varchar(50) DEFAULT NULL,
  `pass_hash` varchar(250) DEFAULT NULL
)

1 个答案:

答案 0 :(得分:0)

这里没有真正的'问题' - 我只是在右栏中的错误数据中有数据。

感谢Aleksandar Miladinovic选择了那个。