Avatar billede loukas Mester
13. december 2002 - 09:15 Der er 11 kommentarer og
1 løsning

SQL- sortering

Jeg har en DB med en masse links.
Den har kollonerne:
  titel | description | www

Jeg har forsøgt at sortere søge resultaterne således:

strTest = TRIM(Request.Form("Keyword"))
strKeyword = split(Trim(Request.Form("Keyword")), " ")

       
        Select Case UBound(strKeyword)
       
        Case "0"
        Response.Write "1 ord"
            strSQL =  "select 1 as myorder, * from power where description like '%" & strTest & "%' and titel like '%" & strTest & "%' and www like '%" & strTest & "%' UNION select 2 as myorder, * from power where description like '%" & strTest & "%' and titel like '%" & strTest & "%' UNION select 3 as myOrder, * from power where titel like '%" & strTest & "%' and www like '%" & strTest & "%' UNION select 4 as myOrder, * from power where titel like '%" & strTest & "%' and description like '%" & strTest & "%'order by myOrder"

        Case "1"
        Response.Write "2 ord"
            strSQL =  "select 1 as myOrder, * from power where description like '%" & strTest & "%' and titel like '%" & strTest & "%' UNION select 2 as myOrder, * from power where description like '%" & strTest & "%' UNION select 3 as myOrder, * from power where description like '%" & strKeyword(0) & "%' and description like '%" & strKeyword(1) & "%'UNION select 4 as myOrder, * from power where description like '%" & strKeyword(0) & "%' OR description like '%" & strKeyword(1) & "%' order by myOrder"

        Case "2"
        Response.Write "3 ord"
            strSQL =  "select 1 as myOrder, * from power where description like '%" & strTest & "%' UNION select 2 as myOrder, * from power where description like '%" & strKeyword(0) & "%' and description like '%" & strKeyword(1) & "%' and description like '%" & strKeyword(2) & "%' UNION select 3 as myOrder, * from power where description like '%" & strKeyword(0) & "%' and description like '%" & strKeyword(1) & "%' order by myOrder" '3 ord i søgningen
       
        Case Else
        Response.Write "+3 ord"
            strSQL =  "select 1 as myOrder, * from power where description like '%" & strTest & "%' UNION select 2 as myOrder, * from power where description like '%" & strKeyword(0) & "%' order by myOrder" 'mere end 3 ord i søgningen
       
        End Select


F.eks. skulle søgning med ét keyword sorteres sådan her:
1. poster hvor TITEL, DESCRIPTION og WWW indeholder keyword
2. poster hvor TITEL, DESCRIPTION indeholder keyword

osv...

som jeg har lavet det vil den retunere samme post flere gange :-(

Hvis nogen har en anden idé til at sortere f.eks som her på eksperten.dk hvor man kan få spørgsmål sorteret efter relevans....
Avatar billede arnvig Nybegynder
13. december 2002 - 09:25 #1
Jeg har ikke lige SQL manualen foran mig, men der findes alternativer til "UNION" som giver det samme resultat uden duplicates.
Prøv at kigge i en SQL-reference
Avatar billede dgivoni Nybegynder
13. december 2002 - 09:39 #2
union boer ifoelge min sql-bog eliminere dubletter automatisk, derimod hvis du skriver Union All kommer dubletter ogsaa med.
Avatar billede dgivoni Nybegynder
13. december 2002 - 09:40 #3
men naar jeg nu naerlaeser din kode, saa kan jeg godt se at det ikke er problemet... Det er dubletter mellem de forskellige sql-kald, ikke?
Avatar billede dgivoni Nybegynder
13. december 2002 - 09:44 #4
jeg tror du er noedt til at bruge
" AND 1 NOT IN (SELECT ...) AND 1 NOT IN (SELECT ...) "
dvs. at du for hver sql-kald ogsaa tjekker at den ikke eksisterer i de andre. Det give nogle meget lange sql-kald, men burde virke.
Avatar billede dgivoni Nybegynder
13. december 2002 - 09:46 #5
F.eks. ved case 2:
Case "2"
Response.Write "3 ord"
strSQL =  "select 1 as myOrder, * from power where description like '%" & strTest & "%' UNION select 2 as myOrder, * from power where description like '%" & strKeyword(0) & "%' and description like '%" & strKeyword(1) & "%' and description like '%" & strKeyword(2) & "%' UNION select 3 as myOrder, * from power where description like '%" & strKeyword(0) & "%' and description like '%" & strKeyword(1) & "%' AND 1 NOT IN (select 1 as myOrder, * from power where description like '%" & strTest & "%' UNION select 2 as myOrder, * from power where description like '%" & strKeyword(0) & "%' ) order by myOrder" '3 ord i søgningen
Avatar billede arnvig Nybegynder
13. december 2002 - 10:01 #6
Rigtigt, Problemet er at det ikke er dubletter, da myOrder er forskellig.

Jeg tænkte også på en "Not In" eller "Not Exists" løsning, men den bliver vist lige lovlig performance tung.

Løsningen kunne være at smide resultatet af dit SQL i en temporær tabel og lave en ny SQL-Query på det.

Select * from temp_table A
where not exists (select myorder
                  from temp_table B
                  where B.myOrder < A.myOrder
)

Finder mindste myorder
Avatar billede arnvig Nybegynder
13. december 2002 - 10:02 #7
Hovsa: skulle være

Select * from temp_table A
where not exists (select myorder
                  from temp_table B
                  where B.myOrder < A.myOrder
                    and B.<tablekey> = A.<tablekey>)
Avatar billede loukas Mester
13. december 2002 - 17:07 #8
Tak for jeres svar !!

Det burde jo virke med:
AND 1 NOT IN (SELECT ...) AND 1 NOT IN osv...
men den bliver sørme tung, derfor vil jeg prøve at arbejde lidt med en temp..
Det har jeg aldrig prøvet så kommer nok til at skulle bruge mere hjælp..
Avatar billede loukas Mester
15. december 2002 - 14:55 #9
Her er SQL-foerspørgelsen på ét ord:

select 1 as myorder, * from power where description like '%" & strTest & "%' and titel like '%" & strTest & "%' and www like '%" & strTest & "%' UNION select 2 as myorder, * from power where description like '%" & strTest & "%' and titel like '%" & strTest & "%' AND 1 NOT IN (select 1 as myorder, * from power where description like '%" & strTest & "%' and titel like '%" & strTest & "%' and www like '%" & strTest & "%')UNION select 3 as myOrder, * from power where titel like '%" & strTest & "%' and www like '%" & strTest & "%' UNION select 4 as myOrder, * from power where titel like '%" & strTest & "%' and description like '%" & strTest & "%'order by myOrder"


Og jeg får en fejl:

You have written a subquery that can return more than one field without using the EXISTS reserved word in the main query's FROM clause. Revise the SELECT statement of the subquery to request only one field.
Avatar billede dgivoni Nybegynder
16. december 2002 - 09:14 #10
Du skal aendre den til:
select 1 as myorder, * from power where description like '%" & strTest & "%' and titel like '%" & strTest & "%' and www like '%" & strTest & "%' UNION select 2 as myorder, * from power where description like '%" & strTest & "%' and titel like '%" & strTest & "%' AND 1 NOT IN (select 1 as myorder from power where description like '%" & strTest & "%' and titel like '%" & strTest & "%' and www like '%" & strTest & "%')UNION select 3 as myOrder, * from power where titel like '%" & strTest & "%' and www like '%" & strTest & "%' UNION select 4 as myOrder, * from power where titel like '%" & strTest & "%' and description like '%" & strTest & "%'order by myOrder"

jeg har fjernet ', * ' i subselecten...
Avatar billede loukas Mester
28. december 2002 - 23:12 #11
den gentager stadig væk flere poster ?"?!
Avatar billede dgivoni Nybegynder
29. december 2002 - 20:39 #12
proev med distinct foran alle feltnavnene: select distinct 1 as myorder, * from power...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester