Grzesiek [ - ! F a f i k ! - ]
Zapytanie SQL - potrzebna pomoc
Upraszczając mam tak:
SELECT
id,title,user,date,categoryId
FROM table
WHERE categoryId IN (@categoryId)
Order By date DESC
I ładnie wyświetlane są wszystkie rekordy wg data malejąco.
Teraz chciałbym, by rekordy o ID=1,2,33,43,100 zostały wyświetlone jako pierwsze przed pozostałymi (pierw 1,2,33,43,100, a później reszta) i wszystko wg daty malejąco. Jest na to jakiś sposób ?
albz74 [ Legend ]
zrób 2 zapytania, najpierw ogranicz ID do wymienionych przez Ciebie, potem łącznik UNION potem drugie zapytanie dla ID różnych od wymienionych. Order by musi być osobno dla każdego zapytania
albz74 [ Legend ]
czyli:
SELECT
id,title,user,date,categoryId
FROM table
WHERE categoryId IN (1,2,33,43,100)
Order By date DESC
UNION
SELECT
id,title,user,date,categoryId
FROM table
WHERE categoryId Not IN (1,2,33,43,100)
Order By date DESC
diuk [ Generaďż˝ ]
Grzesiek --> taka potrzeba świadczy o źle zaprojektowanej strukturze :-) Nigdy nie powinno się nic usztywniać po konkretnym ID.
Możesz dodać dodatkową kolumnę z wymuszoną kolejnością wyświetlania, albo dodać tabelę w tymi ID, które mają być wyśw. wcześniej i odpowiednio złączyć.
Grzesiek [ - ! F a f i k ! - ]
Dzięki, zaraz spróbuję, bo moje zapytanie jest ciut bardziej złożone. Co prawda to się miało tyczyć ID, a nie categoryId, ale to żaden problem :)
diuk ---> potrzebna tego wyświetlania jest uzasadniona tym, że każdy użytkownik może określić sobie inne ID na początku. Jeśli chciałbym globalnie dla wszystkich to zrobić, to dodatkowa kolumna załatwiłaby sprawę.
albz74 [ Legend ]
diuk - przeważnie piszący zapytania mają zerowy wpływ na strukturę :)
A takie ID to może być np typ faktury w SAP, więc czasami usztywnianie do raportów może być konieczne.
diuk [ Generaďż˝ ]
Grzesiek --> "potrzebna tego wyświetlania jest uzasadniona tym, że każdy użytkownik może określić sobie inne ID na początku."
Tym bardziej powinna być dodtkowa tabela (<IdUsera><IdTegoCoMaBycNaPoczatku>) :-)
I to wiele-do-wielu.
diuk [ Generaďż˝ ]
albz74 --> a potem - po wgraniu tego programu dla innego klienta - system nadaje inne IDy dla np. typu faktury i biegasz po kodzie, szukając dlaczego się wykłada :-)
Złe nawyki trzeba zwalczać :-)
albz74 [ Legend ]
diuk - obawiam się że to w systemach ERP niemożliwe - zbyt wiele rzeczy jest narzuconych z góry a już o relacyjności to nikt nie marzy od samego początku :)
Grzesiek [ - ! F a f i k ! - ]
Dobrze koledzy od początku.
Tabele sobie sam tworzę :)
Zapytanie jest walnięte do procedury i używane w aplikacji Asp.Net.
Ze względu na warunek
categorieId In (1,2,3,4) i wymogiem zparametryzowania tego procedura wygląda mniej więcej tak:
ALTER PROCEDURE ShowResult
@id_list varchar(100),
AS
Declare @sql as varchar(max)
SET @sql ='SELECT id,user,categoryId,date
FROM table1 Inner Join
table2 ON table1.id1 = table2.id2
GROUP BY ....
HAVING ...
(table3.categoryId IN (' + @id_list + '))
ORDER BY table2.date DESC'
exec(@sql)
RETURN
Tak na szybko uproszczona procedura (pominiętych kilka rzeczy). Rozwiązanie albz74 działa bardzo ładnie i jestem zadowolony :)
diuk [ Generaďż˝ ]
Grzesiek --> a czemu tworzysz dynamiczne zapytanie?
diuk [ Generaďż˝ ]
Grzesiek --> jeszcze jedno: co będzie, jak lista "tych pierwszych" będzie miała (wraz z przecinkami) więcej niż 100 znaków?
[MiKu[ [ rapmuzik ]
Sorry Grzesiek, ale podlacze sie do Twojego tematu, ok? :) Mam pytanie, jaka ksiazke polecacie dla poczatkujacych z SQLem? Bo w szkole zaczelismy uczyc sie o 3 stopniach normalizacji i o podstawoych komendach sql, a chcialbym troche rozszerzyc swoja wiedze, bo na razie sa to banaly. Z gory dzieki za pomoc :)
pzdr
Grzesiek [ - ! F a f i k ! - ]
diuk ---> Dzięki, że tak pomagasz :)
1. Nie będzie miała więcej niż 100 znaków.
2. Dynamiczne, ponieważ wprowadzenie parametru @id_list w ten sposób: 1,2,3,4,5 nie zwraca mi żadnych rekordów. Dopiero w ten sposób mogę otrzymać wynik. Dlaczego - nie wiem.
albz74 [ Legend ]
Grzesiek - a jakiego typu jest pole categoryID ?
Grzesiek [ - ! F a f i k ! - ]
Integer
[MiKu[ [ rapmuzik ]
Lepiej to podbijac czy zalozyc nowy temat? :)
Grzesiek [ - ! F a f i k ! - ]
[MiKu[ ---> jest kilka pozycji wydawnictwa Helion.pl. Masz też duży zbiór wiedzy tuż pod łapami (google.pl). Możesz też poszukać e-booków odnośnie SQL na eMule'u :)
albz74 [ Legend ]
Grzesiek - spotkałem się z takimi przypadkami że pole jest typu integer ale poszczególne wyniki i tak trzeba umieszczać 'w ciapkach'
czyli categoryID in ('1','2','3','4')
może tak zadziała ?