webForumDet fria alternativet

Krånglig sql fråga går det?

13 svar · 307 visningar · startad av Addeladde

AddeladdeMedlem sedan jan. 20013 406 inlägg
#1

Hej

Jag har två tabeller sidor och mallar med fälten sida_id, sida_kod, sida_mall i sidor och mall_id, mall_kod i mallar.

Jag vill att min sokfråga plockar ut alla sidor som innehåller en viss sökfras eller om en mall_innehåller sokfrasen så ska även den sidan plockas med om det finns en sida som utnyttjar den mallen.

Hur gör man detta? Kanske inte äns går i en sql-fråga??

K@llenMedlem sedan mars 20032 667 inlägg
#2

Finns det någon relation mellan de två tabellerna?

Om det finns en relation skulle du kunna använda en left join.

AddeladdeMedlem sedan jan. 20013 406 inlägg
#3

Det är en access databas men jag har inte gjort någon relation i access.

Men på tabellen sidor så finns det ett fält sida_mallID där id på mallen som sidan använder.

LarsGMedlem sedan dec. 200012 464 inlägg
#4
select * 
from sidor 
where sida_kod like '%<det du vill söka efter>%'
or sida_mall in (select mall_id 
from mallar
where mall_kod like '%<det du vill söka efter>%')
AddeladdeMedlem sedan jan. 20013 406 inlägg
#5

LarsG om ingen sida använder den mallen plockas den ändå ut då?

K@llenMedlem sedan mars 20032 667 inlägg
#6
SELECT sida_id, sida_kod, sida_mall, mall_id, mall_kod 
FROM sida s
LEFT JOIN mall m
ON s.sida_mallID = m.sida_mallID 
WHERE field1 LIKE '%" & searchString & "%'

Jämförelsen bör göras på båda sidor, men jag vet inte vilka fält du vill använda.

AddeladdeMedlem sedan jan. 20013 406 inlägg
#7

Detta verkar fungera fin fint enligt mina tester i alla fall:

sqlString = "SELECT sida_kod, sida_mall, sida_publicering, sida_titel, sida_forfattare, sida_datum_start, sida_datum_slut, sida_indexera, sida_nyckelord, sida_id " &_
 "FROM sidor " &_
 "WHERE sida_publicering = 1 " &_ 
 "AND sida_kod LIKE '%kontaktupg%' " &_
 "OR sida_mall IN (SELECT mall_id " &_
 "FROM mallar " &_
 "WHERE mall_kod LIKE '%kontaktupg%')"
 SET sidorRS = Con.Execute( sqlString )

Återkommer om det inte skulle fungera helt klockrent.

LarsGMedlem sedan dec. 200012 464 inlägg
#8

Jag skulle nog lägga till lite parenteser i where. Vill du ha

sqlString = "SELECT sida_kod, sida_mall, sida_publicering, sida_titel, sida_forfattare, sida_datum_start, sida_datum_slut, sida_indexera, sida_nyckelord, sida_id " &_
 "FROM sidor " &_
 "WHERE sida_publicering = 1 " &_ 
 "AND (sida_kod LIKE '%kontaktupg%' " &_
 "OR sida_mall IN (SELECT mall_id " &_
 "FROM mallar " &_
 "WHERE mall_kod LIKE '%kontaktupg%'))"
 SET sidorRS = Con.Execute( sqlString )

eller

sqlString = "SELECT sida_kod, sida_mall, sida_publicering, sida_titel, sida_forfattare, sida_datum_start, sida_datum_slut, sida_indexera, sida_nyckelord, sida_id " &_
 "FROM sidor " &_
 "WHERE (sida_publicering = 1 " &_ 
 "AND sida_kod LIKE '%kontaktupg%' ) " &_
 "OR sida_mall IN (SELECT mall_id " &_
 "FROM mallar " &_
 "WHERE mall_kod LIKE '%kontaktupg%'))"
 SET sidorRS = Con.Execute( sqlString )

?

AddeladdeMedlem sedan jan. 20013 406 inlägg
#9

Varför paranteserna?

  sqlString = "SELECT sida_kod, sida_mall, sida_publicering, sida_titel, sida_forfattare, sida_datum_start, sida_datum_slut, sida_indexera, sida_nyckelord, sida_id " &_
    "FROM sidor " &_
    "WHERE sida_publicering = 1 " 
    IF specialMall = 1 THEN
      sqlString = sqlString &_
      "AND sida_kod LIKE '%"&sokfras&"%' " &_
      "OR sida_mall IN (SELECT mall_id " &_
      "FROM mallar " &_
      "WHERE mall_kod LIKE '%"&sokfras&"%')"
     END IF
     IF specialmall = 0 AND mallID <> 0 THEN
	   sqlString = sqlString &_
	  "AND sida_mall = " & mallID
     END IF
  SET sidorRS = Con.Execute( sqlString )

Så ser hela satsen ut. Ska jag fortfarande lägga in paranteserna?

LarsGMedlem sedan dec. 200012 464 inlägg
#10

Jo, det tycker jag.

AddeladdeMedlem sedan jan. 20013 406 inlägg
#11

Vad är paranteserna till för då?

K@llenMedlem sedan mars 20032 667 inlägg
#12

Addeladde skrev:

Vad är paranteserna till för då?

För att den ska prova alla OR. Annars avbryter den vid den första OR som ger träff.

LarsGMedlem sedan dec. 200012 464 inlägg
#13

Det är samma skillnad som mellan

(a and b) or c (1)

och

a and (b or c) (2)

Om man skriver

a and b or c (3)

så finns det visserligen en förutbestämd ordning så att det tolkas som ett av ovanstående. Kan du svara på om (3) är samma sak som (1) eller (2)?

AddeladdeMedlem sedan jan. 20013 406 inlägg
#14

Hur ska jag sätta mina paranteser i min sql-fråga då så att alla sidor och mallar uppdateras?

sqlString = "SELECT sida_kod, sida_mall, sida_publicering, sida_titel, sida_forfattare, sida_datum_start, sida_datum_slut, sida_indexera, sida_nyckelord, sida_id " &_
    "FROM sidor " &_
    "WHERE sida_publicering = 1 " 
    IF specialMall = 1 THEN
      sqlString = sqlString &_
      "AND sida_kod LIKE '%"&sokfras&"%' " &_
      "OR sida_mall IN (SELECT mall_id " &_
      "FROM mallar " &_
      "WHERE mall_kod LIKE '%"&sokfras&"%')"
     END IF
     IF specialmall = 0 AND mallID <> 0 THEN
	   sqlString = sqlString &_
	  "AND sida_mall = " & mallID
     END IF
  SET sidorRS = Con.Execute( sqlString )
131 ms totalt · 3 externa anrop · v20260731065814-full.30151723
128 ms — hämta forumlista (db)
0 ms — hämta statistik (cache)
125 ms — hämta tråd, inlägg och bilagor (db)