2012-03-21 70 views
2

我有一個複雜的查詢,我一直在努力,最近我更改了其中一列,以便有多個引用相同外鍵的條目。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 

如果沒有價值我只想要一個空的日期

編輯 我忘了你有同一個主鍵(id#2)的值和空值的情況。在這種情況下,我需要能夠返回Null。如果有任何空值,則應返回空值。 編輯

我試着與一羣玩耍的功能,但不能得到任何接近我想要完成

這是我的查詢的簡化版本,因爲它已經是,不要不想將問題與額外的列混淆。

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

所以要返回TRUE;如果有日期和'null'如果沒有的值? – 2012-03-21 21:08:17

+0

正確,但也有這種情況,如果有一個日期爲空,併爲同一個id定義日期,那麼我希望它也返回null。 (見編號2) – user1245706 2012-03-21 22:00:36

回答

1

檢查是否有掃描記錄存在,而不是加入到直接掃描表:

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

這將如果存在掃描記錄則返回1,否則返回0。如果你真的想使用「true」和NULL,你可以將存在包裝在IF()中。

+0

我最終使用了這個變化來解釋我的第二種情況。結束使用這個:if(存在(從Scan中選擇站點where(site =''OR site = NULL)and Scan.job_job = job.job),NULL,true)作爲掃描, – user1245706 2012-03-22 20:34:51

0

我沒有測試過,但試試這個:

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

感謝您的答案,從我可以告訴這似乎只在日期字段返回值爲1 – user1245706 2012-03-21 22:03:53

+0

一個男人的'1'是另一個男人的'真實'。我繼續前進,並將其更改爲字符串「true」,以便現在能夠產生期望的結果。 – 2012-03-21 23:39:31

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

這個基本查詢也可以給我0和1的 – user1245706 2012-03-21 22:07:34

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 
+0

這個基本查詢爲我的日期字段提供了正確的true和NULL - 正在查看是否可以將它合併到我的較大查詢中 – user1245706 2012-03-21 22:05:38