2010-02-13 7 views
5

To może nie być zbyt sensowne, ale chciałbym, aby MySQL zwróciło mi dokładnie duplikaty wierszy, jeśli są powielone kryteria w klauzuli WHERE IN. czy to możliwe?Wymuś na MySQL duplikaty z klauzuli WHERE IN bez użycia JOIN/UNION?

Właśnie ten przykład:

SELECT 
    columns 
FROM 
    table 
WHERE 
    id IN(1, 2, 3, 4, 5, 1, 2, 5, 5) 

I'ld jak MySQL powrotu mi rzędy id trzy razy 5, dwa identyfikatory 1 i 2, 3 i 4, jeden raz.

Jako długości z IN argumentów, a także duplikatu count (raz, dwa, trzy razy, etc.), będzie arbitralny nie chcę polegać na UNION lub JOIN. Czy coś takiego jest możliwe inaczej?

Odpowiedz

2

Nie jestem pewien, dlaczego chcesz zablokować JOIN jako dość istotne dla SQL. To jak zakaz wywoływania funkcji w języku funkcjonalnym.

Dobrym sposobem na rozwiązanie tego problemu jest utworzenie zestawu wyników zawierającego identyfikatory, które chcesz zwrócić i dołączenie do niego. Oto jeden sposób, aby to zrobić:

SELECT Table1.* 
FROM Table1 
JOIN (SELECT 1 AS id 
     UNION ALL SELECT 2 
     UNION ALL SELECT 3 
     UNION ALL SELECT 4 
     UNION ALL SELECT 5 
     UNION ALL SELECT 1 
     UNION ALL SELECT 2 
     UNION ALL SELECT 5 
     UNION ALL SELECT 5) AS T1 
ON Table1.id = T1.id 

Nie jestem pewien, czy wziąłeś pod uwagę tę metodę? Nie ma żadnych problemów, które wydają się być lękliwe.

Jeśli zablokujesz połączenia, nie możesz tego zrobić, chyba że użyjesz procedury przechowywanej, co powiedziałbym, jest gorsze niż dołączenie.

+0

Cześć Mark, dzięki za odpowiedź. Wygląda na to, że po prostu będę musiał połączyć się z JOIN i UNION. Nie zdawałem sobie sprawy z użycia UNION w sposób, w jaki używasz go tutaj. Nie jestem nawet pewien, czy całkowicie to rozumiem. :) Ale wygląda bardzo fajnie! Powodem, dla którego nie chciałem początkowo używać UNION, jest to, że myślałem, że muszę powtarzać dokładne instrukcje SELECT w kółko. Wygląda to jednak o wiele czystsze. –

+0

Nawiasem mówiąc, czy te UNIONY zagwarantują dokładną kolejność wyników, czy nadal będę musiał użyć klauzuli ORDER, aby zamówić je dokładnie tak, jak poszły w oświadczeniu? –

+0

* potrzebujesz * zamówienia, jeśli chcesz zagwarantować zamówienie. To zawsze prawda. Na szczęście łatwo jest zmienić powyższe zapytanie: "WYBIERZ 1 jako ID, 1 jako SortOrder UNION ALL SELECT 2, 2 UNION ALL SELECT 3, 3' itd ... następnie" ORDER BY SortOrder' na końcu po "JOIN ... WŁĄCZ ... '. –

Powiązane problemy