0

所以我有这个查询:

SELECT * FROM cars {$statement} AND deleted = 'no' AND carID NOT IN (SELECT carID FROM reservations WHERE startDate = '".$sqlcoldate."') GROUP BY model

它基本上检查预订表,然后如果有预订,它会获取这些汽车 ID 并将它们排除在循环之外。

这很酷,因为可能有 3 条道奇毒蛇,而 2 条被预订了,所以它只会显示最后一条,而且每次只显示一条,因为我按模型对结果进行分组。

一切都很好,但是当条目用完时,所有汽车都被预订了,汽车不会出现在汽车列表中。(正如我从查询中清除的那样)。

我想用一种方法来说明结果中是否没有某个汽车型号的行,以显示一个占位符,上面写着“不可用”。

这可能吗?它主要是为了让用户可以看到公司拥有那辆车,但知道它在那个日期不可用。

4

3 回答 3

0

您可能应该在 PHP 中处理这个问题,检查返回的行数并将 0 替换为“UNAVAILABLE”。

根据 TO 评论:

在这种情况下,您要查看

http://dev.mysql.com/doc/refman/5.1/en/case.html

这需要进入 SELECT 列表,例如

SELECT
CASE car_count WHEN 0 THEN 'UNAVAILABLE'
WHERE ...
于 2013-03-07T12:37:53.747 回答
0

如果没有看到你的一些数据,很难给你一个查询,但是如果你将你的子查询移动到你的 select 表达式,你可以返回可用的计数(当它们都被保留时,这将是 0)。然后,当您显示数据时,您可以检查计数是否为 0,并显示您的不可用消息。

编辑:

鉴于桌车:

+----+----------+
| id | model    |
+----+----------+
|  1 | viper    |
|  2 | explorer |
|  3 | viper    |
|  4 | explorer |
+----+----------+

和餐桌预订:

+-------+------------+
| carid | date       |
+-------+------------+
|     1 | 2013-03-07 |
|     3 | 2013-03-07 |
+-------+------------+

类似于您上面的查询将返回:

+----+----------+
| id | model    |
+----+----------+
|  2 | explorer |
+----+----------+

如果您将其更改为:

SELECT
    `outer`.`model`,
    (
        SELECT COUNT(*)
        FROM
            `cars` AS `inner`
        WHERE
            `inner`.`model` = `outer`.`model` AND
            `inner`.`id` NOT IN(
                SELECT `carid`
                FROM `reservations`
                WHERE `date` = '2013-03-07'
            )
        GROUP BY `inner`.`model`
    ) AS `count`
FROM cars AS `outer`
GROUP BY `outer`.`model`;

那么你会得到如下结果:

+----------+-------+
| model    | count |
+----------+-------+
| explorer |     2 |
| viper    |  NULL |
+----------+-------+

如果您随后需要将 NULL 值返回为 0,您可以使用 COALESCE,如 Liv 之前提到的。

漂亮,我相信它可以用一种清洁的方式完成,但它确实有效。

于 2013-03-07T12:47:29.230 回答
-1

这里有一个类似的问题,可能会让你朝着正确的方向前进。查看COALESCE()功能。

内置函数COALESCE()在其参数中返回第一个非空值。这使您可以像这样构造查询SELECT COALSECE(foo, 'bar') [...],如果它不为空,则结果将是列 'foo' 中的值,如果是,则结果将是值 'bar'。

于 2013-03-07T12:51:02.767 回答