【问题标题】:Query not showing the right results查询未显示正确的结果
【发布时间】:2016-10-05 19:47:16
【问题描述】:

我已经建立了一个这样的查询:

        SELECT 
           c.*,
           (SELECT COUNT(cursus_id) FROM cursusdienst_bestellingen where cursus_id = c.id AND datum_afhaling IS  NULL AND datum_verwijderd IS NULL AND studentid = '$studentid') as besteld,
           (SELECT COUNT(cursus_id) FROM cursusdienst_bestellingen where cursus_id = c.id AND datum_afhaling IS NOT NULL AND datum_verwijderd IS NULL AND datum_afgehaald IS NULL AND studentid = '$studentid') as afhalen,
           (SELECT datum_afhaling + INTERVAL 14 DAY FROM cursusdienst_bestellingen where cursus_id = c.id AND datum_afhaling IS NOT NULL AND datum_verwijderd IS NULL AND datum_afgehaald IS NULL AND studentid = '$studentid') as datum_afhaling,
           (SELECT COUNT(cursus_id) FROM cursusdienst_bestellingen where cursus_id = c.id AND datum_afgehaald IS NOT NULL AND datum_verwijderd IS NULL AND cb.studentid = '$studentid') as afgehaald
        FROM 
           cursusdienst c
        LEFT JOIN
           cursusdienst_bestellingen cb
        ON
           cb.cursus_id = c.id    
        WHERE 
           c.studierichting = '1ste Bachelor'
        ORDER BY 
           c.artikel asc, cb.studentid

这是针对学生和课程的注册/订购系统。有很多学生使用这个系统。学生必须先注册,然后才能订购课程。 我在这里的查询有问题,因为我在同一个列表中看到每个学生的课程。这里有一个例子:

Checkbox         Course              Price     Status
Checkbox         Course 1            12.00     Ordered
Checkbox         Course 1            12.00     Ordered
Checkbox         Course 2            25.50     Ready to deliver
Checkbox         Course 3            15.00     

正如您在此处看到的,查询向我显示了 2 名学生的所有课程信息(这只是一个示例),他们已登录并订购了课程。 第一个学生订购了 Course 1 en 2,第二个学生只订购了 Course 1。 如果我以学生身份登录,我只想查看我订购的课程的状态,但我也会看到其余课程(没有像课程 3 这样的任何状态),因此我可以以相同的形式订购其他课程。 不想看到的是别人点的!

因此,如果我作为学生订购了课程 1 和 2,我只想看到这个。课程 3 也在列表中,因为我现在可以订购但我之前没有订购(所以它没有状态) :

Checkbox         Course              Price     Status
Checkbox         Course 1            12.00     Ordered
Checkbox         Course 2            25.50     Ready to deliver
Checkbox         Course 3            15.00     

如果我将“AND cb.studentid = '$studentid'”添加到 WHERE,我只会看到我订购的课程,而不是我未订购的其他课程。

编辑:(感谢 SunKnight0)在 ON 部分而不是 WHERE 部分设置“AND cb.studentid = '$studentid'”!所以工作代码如下所示:

        SELECT 
           c.*,
           (SELECT COUNT(cursus_id) FROM cursusdienst_bestellingen where cursus_id = c.id AND datum_afhaling IS  NULL AND datum_verwijderd IS NULL AND studentid = '$studentid') as besteld,
           (SELECT COUNT(cursus_id) FROM cursusdienst_bestellingen where cursus_id = c.id AND datum_afhaling IS NOT NULL AND datum_verwijderd IS NULL AND datum_afgehaald IS NULL AND studentid = '$studentid') as afhalen,
           (SELECT datum_afhaling + INTERVAL 14 DAY FROM cursusdienst_bestellingen where cursus_id = c.id AND datum_afhaling IS NOT NULL AND datum_verwijderd IS NULL AND datum_afgehaald IS NULL AND studentid = '$studentid') as datum_afhaling,
           (SELECT COUNT(cursus_id) FROM cursusdienst_bestellingen where cursus_id = c.id AND datum_afgehaald IS NOT NULL AND datum_verwijderd IS NULL AND cb.studentid = '$studentid') as afgehaald
        FROM 
           cursusdienst c
        LEFT JOIN
           cursusdienst_bestellingen cb
        ON
           cb.cursus_id = c.id AND cb.student_id = '$studentid'  
        WHERE 
           c.studierichting = '1ste Bachelor'
        ORDER BY 
           c.artikel asc, cb.studentid

【问题讨论】:

  • 你能举例说明你得到了什么和你期望得到什么吗?
  • 我为你编辑了我的问题!
  • 您的查询结果应该包含名为 bested、afhalen、datum_afhaling、afgehaald 的字段,其中 3 个是计数,因此它们应该是整数,一个是日期。这些都不符合您的结果示例。
  • 无论如何我都会猜一猜。将cb.studentid = '$studentid' 添加到LEFT JOINON 部分,而不是WHERE 子句。
  • 我认为现在将其设置在 ON 部分而不是 WHERE 部分是正确的 ;-)

标签: php mysql


【解决方案1】:
SELECT 
   c.*,
   (SELECT COUNT(cursus_id) FROM cursusdienst_bestellingen where cursus_id = c.id AND datum_afhaling IS  NULL AND datum_verwijderd IS NULL AND studentid = '$studentid') as besteld,
   (SELECT COUNT(cursus_id) FROM cursusdienst_bestellingen where cursus_id = c.id AND datum_afhaling IS NOT NULL AND datum_verwijderd IS NULL AND datum_afgehaald IS NULL AND studentid = '$studentid') as afhalen,
   (SELECT datum_afhaling + INTERVAL 14 DAY FROM cursusdienst_bestellingen where cursus_id = c.id AND datum_afhaling IS NOT NULL AND datum_verwijderd IS NULL AND datum_afgehaald IS NULL AND studentid = '$studentid') as datum_afhaling,
   (SELECT COUNT(cursus_id) FROM cursusdienst_bestellingen where cursus_id = c.id AND datum_afgehaald IS NOT NULL AND datum_verwijderd IS NULL AND cb.studentid = '$studentid') as afgehaald
FROM 
   cursusdienst c
LEFT JOIN
   cursusdienst_bestellingen cb
ON
   cb.cursus_id = c.id AND cb.studentid = '$studentid'
WHERE 
   c.studierichting = '1ste Bachelor'
ORDER BY 
   c.artikel asc, cb.studentid

【讨论】:

  • 给astax的建议同样的结果?还是这样做更好?
  • 我不明白这个问题。是关于此处发布的其他答案吗?我不认为它是正确的,它似乎已被删除。
  • 是的,现在我明白了。它已被删除。不用担心...感谢您在这里帮助我;-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-01
相关资源
最近更新 更多