2013-07-06 18 views
6

Chcę wykonać inne SELECT na podstawie danych kolumny. Na przykład mam tabelę http://sqlfiddle.com/#!2/093a2 gdzie chcę porównać start_date i end_date tylko jeśli use_schedule = 1. W przeciwnym razie zaznacz wszystkie dane. (Inny wybór) Zasadniczo chcę tylko porównać datę początkową i końcową, jeśli tylko use_schedule ma wartość 1 i jeśli use_schedule ma wartość 0, wybierz resztę danych.Jak wybrać na podstawie różnych danych kolumny

Przykładem może być coś podobnego

select id, name from table 
where use_schedule = 0 
else 
select id, name, start_date from table 
where use_schedule = 0 and current_date >= start_date. 

Zasadniczo mam dane gdzie harmonogram jest aktywna tylko wtedy spojrzeć na datę początkową i końcową. Ponieważ jeśli harmonogram nie jest włączony, nie ma sensu patrzeć na daty. Po prostu wybierz dane. Przy włączonym harmonogramie chcę bardziej selektywnie wybierać zaplanowane dane.

Próbuję dowiedzieć się, czy instrukcje CASE lub IF MySQL będą działać, ale nie są w stanie tego zrobić. Jak mogę uruchomić tę opcję?

Dzięki.

+0

Co to znaczy, że chcesz porównać datę_początkową i datę_końcową? JEŚLI start, jeśli po zakończeniu? Początek jest wcześniej? proszę podać więcej danych. –

+0

Zasadniczo mam dane, w których harmonogram jest włączony, a następnie spójrz na datę początkową i końcową. Ponieważ jeśli harmonogram nie jest włączony, nie ma sensu patrzeć na daty. Po prostu wybierz dane. Przy włączonym harmonogramie chcę bardziej selektywnie wybierać zaplanowane dane. – NBhatti

+0

OK, teraz mam pytanie lepiej, dodaj to do pytania, aby było lepiej wyjaśnione. Widzę, że umieszczasz "mysql" tylko jako tag, czy używasz również języka po stronie serwera? –

Odpowiedz

1

Można użyć UNION mieszać i dopasowywać wyniki 2 różnych zapytań SQL do zestawu jeden wynik.

select id, name, null from table 
where use_schedule = 0 
union 
select id, name, start_date from table 
where use_schedule = 1 and current_date >= start_date 

Należy pamiętać, że oba zapytania muszą mieć zgodne pola wyjściowe (ten sam numer i typ, aby działało). Korzystanie z UNION powoduje automatyczne scalanie tylko odrębnych rekordów - jeśli chcesz zachować podwójne wyniki, użyj zamiast tego UNION ALL.

W tym konkretnym przypadku bardziej rozległe WHERE -clause będzie również pracować oczywiście:

where use_schedule = 0 or (use_schedule = 1 and current_date >= start_date) 

Ale biorąc pod uwagę kwestię Jestem zakładając swój prawdziwy przypadek jest nieco bardziej skomplikowana.

Documentation over at MySQL site.

+0

Unia to właściwie dwa WYBIERAJE, których staram się unikać. Jeśli opcja jest 2 WYBORY, mógłbym to zrobić w moim języku programowania. Twoje rozwiązanie działa idealnie, ale zobaczmy, czy uda nam się coś bardziej efektywnego? – NBhatti

+0

Połączenie 2 selekcji jest znacznie wydajniejsze niż 2 oddzielne selekcje wewnętrzne. –

1

z przypadkiem, w tym przypadku ..:

SELECT id, name, 
    (CASE 
     WHEN start_date >= DATE(NOW()) AND use_schedule = 1 
     THEN start_date 
    ELSE NULL 
    END) AS cols FROM campaigns 

ten sposób wybiera tylko rozkład 0 lub dnia 1 z datą większe lub równe tej pory; użyłem daty (NOW()) tak, że usuwa czas, którego nie interesuje

Powiązane problemy