【发布时间】: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 JOIN的ON部分,而不是WHERE子句。 -
我认为现在将其设置在 ON 部分而不是 WHERE 部分是正确的 ;-)