2012-03-21 4 views
2

У меня сложный запрос, над которым я работал, и недавно я изменил один из столбцов, чтобы было несколько записей, которые ссылаются на один и тот же внешний ключ.mysql limit количество результатов для определенного столбца

Есть ли простой способ сделать это так, что если есть один или несколько записей с одним и тем же внешним ключом, то возвращается значение «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. EDIT

Я пытался играть с группой по функции, но не может получить что-нибудь близко к тому, что я пытаюсь выполнить

Это упрощенная версия моего запроса, как это уже, дон Не хотите путать проблему с дополнительными столбцами.

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', если ее там нет? –

+0

правильно, есть также случай, когда, если есть дата, которая равна null, а дата, определенная для одного и того же идентификатора, я также хочу, чтобы она также возвращала значение null. (см. id # 2) – user1245706

ответ

1

Проверьте, есть ли запись о проверке существует, а не присоединение к таблице сканирования непосредственно:

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

Это будет return 1, если существует запись сканирования, 0, если нет. Если вы действительно хотите использовать «true» и NULL, вы можете обернуть это в IF().

+0

В итоге я воспользовался вариантом этого, чтобы учесть мой второй случай. Завершив это с помощью этого: if (существует (выберите сайт из Scan where (site = '' OR site = NULL) и Scan.job_job = job.job), NULL, true) как Scanning, – user1245706

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

+0

Один человек '1' - это еще один« истинный »человек. Я пошел вперед и изменил его на строку «true», чтобы теперь получить желаемые результаты. –

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

этот базовый запрос работает также, давая мне 0 и 1's – user1245706

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

этот базовый запрос дает мне правильную истину и NULL для моего поля даты - работает, чтобы проверить, могу ли я включить его в мой более крупный запрос правильно – user1245706

Смежные вопросы