2017-10-03 50 views
5

Mam dwie nazwy tabeli "activites" & "archived_activities". Przekazuję swój rekord aktywności działań do innego rekordu tabeli. Tabela działań zawiera tylko pierwsze 200 ostatnich działań użytkowników, a pozostały rekord został przeniesiony do tabeli archive_activities. Teraz chcę dołączyć do obu tabel tylko wtedy, gdy tabela działań zwraca wartość null, a następnie chcę użyć tego samego przesunięcia i limitu dla tabeli archive_activities, aby pobrać następny rekord. Poniżej moje zapytanie, które nie działa poprawnie.Jak pobrać rekord z innej tabeli, jeśli pierwsza tabela nie zwraca rekordu przy użyciu UNION w zapytaniu MySQL

SELECT * FROM activities WHERE user_id=87 LIMIT 180,20 
UNION ALL 
SELECT * FROM activities WHERE user_id=87 LIMIT 180,20 

Ale to zapytanie nie działa poprawnie.

Każda pomoc?

Odpowiedz

1

Można użyć NOT EXISTS():

SELECT * FROM activities 
WHERE user_id=87 
LIMIT 180,20 
UNION ALL 
SELECT * FROM archieve_activities 
WHERE NOT EXISTS(SELECT 1 FROM activities 
       WHERE user_id = 87) 
    AND user_id=87 
LIMIT 180,20 
+0

Ale co się stanie, jeśli pierwsza tabela ma powiedzieć 100 rekordów, a więc 100 powinna być pobrana z tabeli archiwum? –

+0

"tylko wtedy, gdy tabela działań zwraca wartość null, a następnie ja .." Wygląda na to, że tak nie jest. Poczekaj na OP, aby skomentować @TimBiegeleisen – sagi

2

Jedno podejście tutaj byłoby zrobić unii dostać zarówno bieżące i zarchiwizowane rekordy w jeden logiczny tabeli, ale aby je zamówić takie, że obecne zapisy uzyskać wyższy priorytet, powinna oni istnieją. Przypisuję pozycję 1 do bieżących rekordów, a 2 do zarchiwizowanych rekordów. Następnie zamawiam w tej pozycji i zachowuję 200 rekordów.

SELECT col1, col2, ... 
FROM 
(
    SELECT col1, col2, ..., 1 AS position 
    FROM activities 
    WHERE user_id = 87 
    UNION ALL 
    SELECT col1, col2, ..., 2 
    FROM archived_activities 
    WHERE user_id = 87 
) t 
ORDER BY 
    position 
LIMIT 200; 
+0

Wydaje się lepszym rozwiązaniem niż moje @RizwanSaleem – sagi

0

Można spróbować to zapytanie

select * from activities as a 
union all 
select * from archived_activities as b 
where b.user_id not in 
(select r.user_id 
from activities as r)