Zadałem pytanie dotyczące wielu wierszy w poprzednim wątku, ale teraz muszę wiedzieć o jednym wierszu. To jest przykładowe zapytanie:
SELECT * FROM table1 WHERE this = 5 LIMIT 1
Ale jeśli nie znaleziono żadnych wierszy, chciałbym wtedy znaleźć rekord o innej wartości:
SELECT * FROM table1 WHERE this = 1 LIMIT 1
Chcę więc znaleźć wiersz o wartości 5, jeśli nie zostanie znaleziony, to domyślnie znajdź wiersz o wartości 1. Jak to zrobić w jednym zapytaniu? Czy tak działałoby oświadczenie OR?
SELECT * FROM table1 WHERE this = 5 OR this = 1 LIMIT 1
Czy kolejność instrukcji OR spróbuje znaleźćdowolny wiersz o wartości 5, jeśli zostanie znaleziony, to zatrzyma się i zwróci wiersz? JEŻELI nie znaleziono, poszukaj 1, a następnie zwróć ten wiersz? Jeśli nie, to jak mam to zrobić za pomocą pojedynczego zapytania, w którym szuka jednej wartości, jeśli nie znaleziono wartości domyślnej, aby znaleźć inną wartość?
Myślałem o tym zapytaniu:
SELECT * FROM table1 WHERE this IN(5,1) ORDER BY this ASC LIMIT 1
Jednak to zapytanie zawsze zwróci wartość 1, jeśli obie wartości zostaną znalezione, prawda? Więc próbowałem tego:
SELECT * FROM table1 WHERE this IN(5,1) ORDER BY this DESC LIMIT 1
Ale to zawsze zwróci wartość 5, jeśli oba wiersze zostaną uznane za prawidłowe?
Odpowiedzi:
1 dla odpowiedzi № 1Wydaje się, że twoje pytanie nadaje priorytet wyszukiwaniudla 5 i tylko jeśli nie zostanie znaleziony, to poszukaj 1. Stąd twoje drugie rozwiązanie spełnia wymóg grzywny. Zwróci wartość 5 niezależnie od tego, czy 5 zostanie znalezione, czy tylko 5 i 1 istnieją.
druga opcja
SELECT * FROM table1 WHERE this IN(5,1) ORDER BY this DESC LIMIT 1
0 dla odpowiedzi nr 2
Spróbuj tego
SELECT *
FROM table1 tab
WHERE tab.this = IF((SELECT COUNT(*)
FROM table1
WHERE this = 5) > 0, 5, 1)
Zapytanie wewnątrz IF sprawdza liczbę.
Nie jestem pewien co do wydajności, ale myślę, że to rozwiązuje problem.