【问题标题】:Query not selecting all rows in table查询未选择表中的所有行
【发布时间】:2015-05-20 23:29:25
【问题描述】:

******编辑********

Sql 小提琴here

******编辑********

我正在尝试连接来自四个不同表的数据。

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

我知道这可以通过 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
)

【问题讨论】:

  • 试过删除where 子句吗?
  • 是的,我试过不带where,也没有left join(因此也没有where)。这很令人沮丧。
  • 尝试同时创建 INNER JOIN 和 LEFT JOIN,你应该开始看到数据和 NULL 数据最有可能丢失/不匹配的地方
  • @Strawberry 他正在过滤 NULL...虽然我通常使用 HAVING,只是因为它似乎更适合我。
  • 这是捕获您的表可用性列 ref_num 的值 (3, 3, 5, 5, 6) 并且您的表裁判列 ref_number 在 INNER 之后的值 (1, 2, 3, 4)查询的两列结果只有两行的表......并且问题从哪里开始(所以你应该在 ref_num 中添加一些值为 1、2、4 等的表可用性数据)

标签: php mysql sql join


【解决方案1】:

在这里可以说没有真正的“问题” - 我只是在正确的列中有错误的数据。

感谢 Aleksandar Miladinovic 挑选了那个。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-16
    相关资源
    最近更新 更多