mysql限制特定列的结果数

时间:2012-03-21 20:59:29

标签: mysql

我有一个复杂的查询,我一直在努力,最近我更改了其中一个列,以便有多个条目引用相同的外键。

是否有一种简单的方法可以使得如果有一个或多个具有相同外键的条目返回值为“true”(或其他某个值)而不是n个单独的行?

例如

我想要这个:

id |  Date
1  |  true
2  |  NULL

而不是这个(现在发生了什么):

id |  Date
1  |  feb 4
1  |  feb 5
1  |  feb 6
2  |  NULL
2  |  feb 5

如果没有值我只想为日期

EDIT 我忘记了同一主键(id#2)同时具有值​​和空值的情况。在这种情况下,我需要能够返回Null。如果有任何空值,则它应返回null。 修改

我尝试过按功能分组,但无法接近我想要完成的任务

这是我的查询的简化版本,因为它已经存在,不希望将此问题与额外的列混淆。

SELECT distinct job, DATE_FORMAT( scan_date, '%M %e, %Y, %l:%i%p' ) AS Scanning
FROM Scan, job
WHERE Scan.job_job = job

5 个答案:

答案 0 :(得分:1)

检查是否存在任何扫描记录,而不是直接加入Scan表:

SELECT distinct job, exists(select 1 from Scan where Scan.job_job = job) AS Scanning
FROM job;

如果存在扫描记录,则返回1,否则返回0。如果你真的想使用“true”和NULL,你可以将exists包装在IF()中。

答案 1 :(得分:0)

我还没有测试过,但试一试:

SELECT DISTINCT j.job, CASE WHEN scan_date IS NULL THEN null 
                            ELSE 'true'
                       END
FROM Scan, job
WHERE Scan.job_job = job

答案 2 :(得分:0)

要返回true或null,可以在select子句中使用CASE WHEN语句。有关详细信息,请参阅 - http://msdn.microsoft.com/en-us/library/ms181765.aspx

答案 3 :(得分:0)

SELECT job, COUNT(scan_date) != 0 AS Scanning
  FROM job
  LEFT JOIN scan ON job_job = job
  GROUP BY job

答案 4 :(得分:0)

这是另一种解决方案:

SELECT j.job, IF(COUNT(s.scan_date) > 0, 'true', NULL) AS Scanning
FROM job j
LEFT JOIN Scan s
  ON j.job = s.job_job
GROUP BY j.job