webForumDet fria alternativet

Sökning i flera tabeller

21 svar · 316 visningar · startad av H_E_Pennypacker

H_E_PennypackerMedlem sedan apr. 200164 inlägg
#1

Jag gör en söksida där jag vill att sökningen ska gå igenom flera databaser

Hur gör jag för att jag ska kunna läsa in flera tabeller? exempelvis:
ID, Namn, bild från tabell 1, tabell 2, tabell 3

@ndersMedlem sedan juni 200032 969 inlägg
#2

hello, und willkommen auf wF (kan inte tyska, men det får duga ;) )

databasmotor? access? sql server?
hur ser relationerna ut?
menar du flera databaser som du skrev först, eller flera tabeller som du skrev sen?

------------------
<A HREF="http://cartman.nu" TARGET=_blank>
all your base are belong to us!</A>

H_E_PennypackerMedlem sedan apr. 200164 inlägg
#3

Ja du, det kanske är svårt att lösa när man inte får tillräcklig information, jag är nybörjare inom området, men då ska vi se:
Det är 1 databas men i den flera tabeller. Databasen är gjord i Access. Jag jobbar i Dreamweaver Ultradev 4, och när jag skriver följande
SELECT * FROM tabell1, tabell2
Så får jag fram 10 st av varje rad i tabell1 men ingen från tabell2.
Tabellerna ser också något olika ut, har lite olika fält.
Ex. Tabell1 Tabell2
-------- --------
ID ID
Namn Namn
Bild Bild
Smak Färg

Vet inte om detta var till någon mer hjälp?

H_E_PennypackerMedlem sedan apr. 200164 inlägg
#4

Det vart lite kluddigt men

Tabell1 innehåller fälten
ID, Namn, Bild, Smak

Medans Tabell2 innehåller fälten
ID, Namn, Bild, Färg

@ndersMedlem sedan juni 200032 969 inlägg
#5

ok, det handlar alltså inte om en join, du har inga relationer mellan tabellerna, utan du vill bara få ut allt från tabell1 och allt från tabell2?

prova en liten union, kanske?

select * from Tabell1
union
select * from Tabell2

nånting sånt borde funka...

mvh,

------------------
<A HREF="http://cartman.nu" TARGET=_blank>
all your base are belong to us!</A>

H_E_PennypackerMedlem sedan apr. 200164 inlägg
#6

Provade med koden:

select * from ol
union
select * from snaps

Men fick felmeddelandet:

[Microsoft][Drivrutin för ODBC Microsoft Access] Antalet kolumner i tabellerna eller frågorna i unionsfrågan stämmer inte överens.

LarsGMedlem sedan dec. 200012 464 inlägg
#7

Jo, så är det här i livet. När man använder union så måste vara lika många kolumner i select-listorna och så måste typerna vara samma (eller åtminstone jämförbara).
Du kan ju lägga till några dummyvärden i den ena select-listan så att det stämmer.

------------------
essentitia preter non sans multiplicandum

H_E_PennypackerMedlem sedan apr. 200164 inlägg
#8

du menar i databasen eller i sql strängen, om senare isåfall hur?

LarsGMedlem sedan dec. 200012 464 inlägg
#9

Jag menar i sql-strängen.
Antag att t1 har kolumnerna

c1 int
c2 char
c3 int
c4 char

och att t2 har kolumnerna

c1 int
c2 char

då kan man skriva en union så här

  select c1,c2,c3,c4 from t1
  union
  select c1,c2,0,'' from t2

------------------
essentitia preter non sans multiplicandum

H_E_PennypackerMedlem sedan apr. 200164 inlägg
#10

som sagt jag är inget vidare vettigt bra på detta (men det är väl bla därför såna här forum finns)

Behöver egentligen inte ta ut all information ur tabellerna (*), det räcker med ett antal rader som jag vet finns i båda tabellerna, men med denna kod:

select ID, Namn, Bild, Betyg, Producent from ol
union
select ID, Namn, Bild, Betyg, Producent from snaps

Får jag felmeddelandet:
[Microsoft][Drivrutin för ODBC Microsoft Access] För få parametrar angavs. 1 förväntades.

Hur ser jag om kolumnerna är INT eller CHAR?

@ndersMedlem sedan juni 200032 969 inlägg
#11

hej!

det känns som att 'namn' är ett reserverat ord, som skapar felmeddelandet du får.

du måste nog faktiskt klamra dina kolumner om du ska använda reserverade ord som fältnamn.

------------------
<A HREF="http://cartman.nu" TARGET=_blank>
all your base are belong to us!</A>

H_E_PennypackerMedlem sedan apr. 200164 inlägg
#12

@nders

skulle du bara kunna förklara klamra

@ndersMedlem sedan juni 200032 969 inlägg
#13

klamra - specificera fältnamnen inom hakparenteser.

select [namn], [select] from tblBah

typ.

------------------
<A HREF="http://cartman.nu" TARGET=_blank>
all your base are belong to us!</A>

H_E_PennypackerMedlem sedan apr. 200164 inlägg
#14

tack

Men upptäckte var felet låg. Lite pinsamt men jag hade döpt om ett av fältnamnen när jag testade. Ändrade tillbaka och allt fungerade.
Då kommer tyvärr nästa problem

Alla sökresultat som kommer ifrån tabellen snaps ska länkas till /snaps.asp?ID=
medan allt från tabellen ol ska länkas till /ol.asp?ID=

Svårlöst? eller ska jag bara lägga ner?

@ndersMedlem sedan juni 200032 969 inlägg
#15

lägga ner?

inte då! ;)

men då måste vi ju veta varifrån värdena kommer.

select kol1, kol2, kol3, 'snaps' as typ from snaps
select  kol1, kol2, kol3, 'ol' as typ from ol

borde göra tricket. nu har du ett fält i ditt resultset som heter typ, som innehåller antingen 'snaps' eller 'ol'.

när du drar ut din loop så länkar du bara till <%=objRS("typ")%>.asp?id=<%=objRS("ID")%>

mvh,

------------------
<A HREF="http://cartman.nu" TARGET=_blank>
all your base are belong to us!</A>

H_E_PennypackerMedlem sedan apr. 200164 inlägg
#16

det börjar ta sig, men lite nya problem, säkert enkla att lösa, den ska ju sortera ut efter sökningen
Jag kodade följande

SELECT ID, Namn, Betyg, Bild, Producent, 'snaps' as typ from snaps  union  select ID, Namn, Betyg, Bildliten, Producent, 'ol' as typ
FROM ol
WHERE Namn like Request.Form('"sok"')
ORDER BY Namn

Fungerade inte riktigt:
Odefinerad funktion "Request.Form" i uttryck.

Nåt förslag?

@ndersMedlem sedan juni 200032 969 inlägg
#17

använder du asp för detta?

kan man få se på den asp-kod som skapar frågan ovan, så ska vi kunna hjälpa dig.

------------------
<A HREF="http://cartman.nu" TARGET=_blank>
all your base are belong to us!</A>

H_E_PennypackerMedlem sedan apr. 200164 inlägg
#18

kör ultradev 4
men koden ser ut som följer (hoppas det var den här du ville ha)

<%
set ta_ut_allt = Server.CreateObject("ADODB.Recordset")
ta_ut_allt.ActiveConnection = MM_Barbarnes_test_STRING
ta_ut_allt.Source = "SELECT ID, Namn, Betyg, Bild, Producent, 'snaps' as typ from snaps  union  select ID, Namn, Betyg, Bildliten, Producent, 'ol' as typ  FROM ol  WHERE Namn like Request.Form('"sok"')  ORDER BY Namn"
ta_ut_allt.CursorType = 0
ta_ut_allt.CursorLocation = 2
ta_ut_allt.LockType = 3
ta_ut_allt.Open()
ta_ut_allt_numRows = 0
%>
<%
' *** Go To Record and Move To Record: create strings for maintaining URL and Form parameters

' create the list of parameters which should not be maintained
MM_removeList = "&index="
If (MM_paramName <> "") Then MM_removeList = MM_removeList & "&" & MM_paramName & "="
MM_keepURL="":MM_keepForm="":MM_keepBoth="":MM_keepNone=""

' add the Form variables to the MM_keepForm string
For Each Item In Request.Form
  NextItem = "&" & Item & "="
  If (InStr(1,MM_removeList,NextItem,1) = 0) Then
    MM_keepForm = MM_keepForm & NextItem & Server.URLencode(Request.Form(Item))
  End If
Next

' create the Form + URL string and remove the intial '&' from each of the strings
MM_keepBoth = MM_keepURL & MM_keepForm
if (MM_keepBoth <> "") Then MM_keepBoth = Right(MM_keepBoth, Len(MM_keepBoth) - 1)
if (MM_keepURL <> "")  Then MM_keepURL  = Right(MM_keepURL, Len(MM_keepURL) - 1)
if (MM_keepForm <> "") Then MM_keepForm = Right(MM_keepForm, Len(MM_keepForm) - 1)

' a utility function used for adding additional parameters to these strings
Function MM_joinChar(firstItem)
  If (firstItem <> "") Then
    MM_joinChar = "&"
  Else
    MM_joinChar = ""
  End If
End Function
%>
@ndersMedlem sedan juni 200032 969 inlägg
#19

jepps.

det är i första stycket du ska ändra lite.

<%
set ta_ut_allt = Server.CreateObject("ADODB.Recordset")
ta_ut_allt.ActiveConnection = MM_Barbarnes_test_STRING
ta_ut_allt.Source = "SELECT ID, Namn, Betyg, Bild, Producent, 'snaps' as typ from snaps WHERE Namn like '%" & Request.Form("sok") & "%' union select ID, Namn, Betyg, Bildliten, Producent, 'ol' as typ FROM ol WHERE Namn like '%" & Request.Form("sok") & "%' ORDER BY Namn"
ta_ut_allt.CursorType = 0
ta_ut_allt.CursorLocation = 2
ta_ut_allt.LockType = 3
ta_ut_allt.Open()
ta_ut_allt_numRows = 0
%>

hur gick det där?

------------------
<A HREF="http://cartman.nu" TARGET=_blank>
all your base are belong to us!</A>

H_E_PennypackerMedlem sedan apr. 200164 inlägg
#20

Nja, nu verkar den bara ta ut information ur tabellen snaps, alla rader oavsett vad man söker på.
Så här ser hela seachresult.asp ut:

<%@LANGUAGE="VBSCRIPT"%> 
<!--#include file="Connections/Barbarnes_test.asp" -->
<%
set ta_ut_allt = Server.CreateObject("ADODB.Recordset")
ta_ut_allt.ActiveConnection = MM_Barbarnes_test_STRING
ta_ut_allt.Source = "SELECT ID, Namn, Betyg, Bild, Producent, 'snaps' as typ from snaps  union  select ID, Namn, Betyg, Bildliten, Producent, 'ol' as typ  FROM ol  WHERE Namn like '%" & Request.Form("sok") & "%'  ORDER BY Namn ASC"
ta_ut_allt.CursorType = 0
ta_ut_allt.CursorLocation = 2
ta_ut_allt.LockType = 3
ta_ut_allt.Open()
ta_ut_allt_numRows = 0
%>
<HTML>
<HEAD>
<TITLE> Sökresultat - från Bar Barnes</TITLE>
</HEAD>
<body>
<p> 
  <% If ta_ut_allt.EOF then %>
  Tyv&auml;rr s&aring; kunde inte din s&ouml;kning matchas med v&aring;r databas, 
  prova igen! 
  <% Else %>
  Din s&ouml;kning gav f&ouml;ljande tr&auml;ffar:</p>
<p>&nbsp;</p>
<p> 
  <% Do Until ta_ut_allt.EOF %>
  <%=UCASE(ta_ut_allt.Fields.Item("Namn").Value)%></p>
<p> 
  <%
		ta_ut_allt.MoveNext
		Loop
		%>
</p>
<%
End If
%>
</HTML>
<%
ta_ut_allt.Close()
%>

Och formuläret på söksidan ser ut så här:

<form name="form1" method="post" action="searchresult.asp">
                    <p align="center"> 
                      <input type="text" name="sok" size="20">
                      <input type="image" src="images/bb_sok.gif" width="56" height="32" border="0" name="image">
                    </p>
                  </form>

Några förslag?

137 ms totalt · 3 externa anrop · v20260731065814-full.fb544a5a
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
134 ms — hämta tråd, inlägg och bilagor (db)