Nån form av JOIN borde ju funka.
select * FROM RegisterMarken LEFT JOIN RegisterModell ON RegisterMarken.Tillverkare = RegisterModell.Tillverkare WHERE RegiterModell.Prio = 1
21 svar · 1 200 visningar · startad av Sanji
Hej! jag har gjort en lista i asp som hämtar data ur två olika tabeller. Den ena hämtar motorcykelmärken och skapar en rad i en html-tabell för varje märke, och den andra hämtar alla motorcykelmodeller där fältet "Prio = 1".
Det funkar bra och visar en lista med märken och modeller, men problemet jag har är att den skapar en rad i tabellen för motorcykelmärken som inte har några modeller med "prio = 1". jag vill bara visa de märken som har modeller med "prio=1", här nedan följer min kod på själva tabellen:
<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="0" WIDTH="100%">
<%
Set Recset = server.CreateObject("ADODB.recordset")
sel = "select * FROM RegisterMarken"
Recset.open sel, connect
DO UNTIL RecSet.EOF
%>
<TR>
<TD WIDTH="100" CLASS="brod"> <%=RecSet("Name")%></TD>
<TD ALIGN="center" CLASS="brod">Prio </TD>
<TD ALIGN="center" CLASS="brod"> Antal</TD>
<TD ALIGN="center" CLASS="brod">90</TD>
<TD ALIGN="center" CLASS="brod">91</TD>
<TD ALIGN="center" CLASS="brod">92</TD>
<TD ALIGN="center" CLASS="brod">93</TD>
<TD ALIGN="center" CLASS="brod">94</TD>
<TD ALIGN="center" CLASS="brod">95</TD>
<TD ALIGN="center" CLASS="brod">96</TD>
<TD ALIGN="center" CLASS="brod">97</TD>
<TD ALIGN="center" CLASS="brod">98</TD>
<TD ALIGN="center" CLASS="brod">99</TD>
<TD ALIGN="center" CLASS="brod">00</TD>
<TD ALIGN="center" CLASS="brod">01</TD>
<TD ALIGN="center" CLASS="brod">02</TD>
<TD ALIGN="center" CLASS="brod">03</TD>
<TD ALIGN="center" CLASS="brod">04</TD>
</TR>
Tabellen som märkena ligger i heter : RegisterMarken
Tabellen som modellerna ligger i heter: RegisterModell
här finns prio-fälten.
hur kan jag göra så att utskriften av märkena som finns i RegisterMarken sker endast då prio=1 i tabellen ReisterModell stämmer?
MVH. Marcus
Nån form av JOIN borde ju funka.
select * FROM RegisterMarken LEFT JOIN RegisterModell ON RegisterMarken.Tillverkare = RegisterModell.Tillverkare WHERE RegiterModell.Prio = 1
Jag är nu tillbaka från semestern, jag ska testa detta och återkommer med svar!
Hmm...
jag tycker att detta borde funka, men om jag använder LEFT JOIN så listas endast några märken upp och inget annat, och då jag bara använder JOIN så får jag detta felmeddelande: [Microsoft][ODBC Microsoft Access Driver] Syntax error in FROM clause. Någon som har någon idé? jag ska testa mig fram lite så länge...
min sql-rad ser ut så här för tillfället:
sel = "SELECT * FROM RegisterMarken JOIN RegisterModell ON RegisterMarken.Name = RegisterModell.Marke WHERE RegisterModell.Prio = 1"
Det är en till sak som stör mig... om man gör på det här sättet så kommer det bli en grafisk tabellrad för varje motorcykel, ex. kawasaki-motorcyklar sorteras inte under kawasaki utan det blir en ny kawasakirubrik för varje kawasaki-motorcykel.
Byt JOIN till INNER JOIN -- samma sak men annan syntax.
Tack
tack för hjälpen, men är det någon som har en lösning till mitt andra problem?
Det är en till sak som stör mig... om man gör på det här sättet så kommer det bli en grafisk tabellrad för varje motorcykel, ex. kawasaki-motorcyklar sorteras inte under kawasaki utan det blir en ny kawasakirubrik för varje kawasaki-motorcykel.
jag vill ha endast EN tabellrad för varje märke.
Studera detta exempel... och gör dig själv en tjänst och överväg att undvika frestelsen att skriva "SELECT stjärna"! :-)
SELECT u.intID, u.strFirstName, u.strLastName FROM [users] u ORDER BY u.strLastname, u.strFirstname;
Det finns ingen anledning till att skriva select stjärna och det är bara nybörjare som gör det också, alternativt folk som av någon anledning vill... bara för de inte orkar skriva eller vad som helst!?
Oavsett vilket, det är sämsta alternativet alla kategorier! :-)
Eftersom ett märke kan ha flera modeller så visas märket logiskt flera gånger (en för varje modell).
Om du vill ha ex:
Märke 1
Modell 1
Modell 2
Märke 2
...
så får du kolla i loopen om du redan skrivit ut märket eller ej.
Dim manufacter
manufacter = ""
DO UNTIL RecSet.EOF
If manufacter <> RecSet("Namn") Then
Response.Write(RecSet("Namn"))
manufacter = RecSet("Namn")
End If
...
Studera detta exempel... och gör dig själv en tjänst och överväg att undvika frestelsen att skriva "SELECT stjärna"! :-)
SELECT u.intID, u.strFirstName, u.strLastName FROM [users] u ORDER BY u.strLastname, u.strFirstname;
Det finns ingen anledning till att skriva select stjärna och det är bara nybörjare som gör det också, alternativt folk som av någon anledning vill... bara för de inte orkar skriva eller vad som helst!?
Oavsett vilket, det är sämsta alternativet alla kategorier! :-)
Håller inte med, jag föredrar * på alla tabeller utom extremt stora och då jag endast söker en eller ett par kolumner.
Och att döpa kolumner till int[Komumn], str[Kolumn] är verkligen inte nått jag rekomenderar!
Sen om jag tillhör nybörjarna eller annat folk låter jag vara osakt! ;)
tack alla som svarat
tack så mycket för all hjälp, nu ska jag testa det där med loopen direkt!
en sak jag funderar på är, vad gör: "manufacter <> RecSet("Namn")" ? jag har inte sett <> användas förut.
<> innebär att det skall vara skillt ifrån något:
"bob" <> "Göran"
kommer bli sant eftersom bob inte är Göran.
aha, då förstår jag! tack så mycket
Grejen med att kolla om märket redan skrivits ut med denna loop
Dim manufacter
manufacter = ""
DO UNTIL RecSet.EOF
If manufacter <> RecSet("Namn") Then
Response.Write(RecSet("Namn"))
manufacter = RecSet("Namn")
End If
är att jag inte får det att funka ordentligt. för det första så skrivs det ut en massa märken som innan, och de hamnar heller inte i en tabell.
Ursäkta för att jag är lite nybörjare, jag har bara pracis börjat med ASP så jag är inte så van vid att felsöka och komma på lösningar :(
ursäkta mig
loopen fungerar om man sorterar mysql_query'n efter Märken. Jag återkommer när jag fått iordning på allt!
ungefär så här ser min nuvarande sida ut:
<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="0" WIDTH="100%">
<%
Set Recset = server.CreateObject("ADODB.recordset")
sel = "SELECT * FROM RegisterMarken INNER JOIN RegisterModell ON RegisterMarken.ID = RegisterModell.BrandID WHERE RegisterModell.Prio = 1 ORDER BY RegisterModell.Marke ASC"
Recset.open sel, connect
Dim manufacturer
manufacturer = ""
DO UNTIL RecSet.EOF
if manufacturer <> RecSet("Marke") Then
%>
<TR>
<TD WIDTH="100" CLASS="brod"><%=RecSet("Marke")%></TD>
<TD ALIGN="center" CLASS="brod">Prio </TD>
<TD ALIGN="center" CLASS="brod"> Antal</TD>
<TD ALIGN="center" CLASS="brod">90</TD>
<TD ALIGN="center" CLASS="brod">91</TD>
<TD ALIGN="center" CLASS="brod">92</TD>
<TD ALIGN="center" CLASS="brod">93</TD>
<TD ALIGN="center" CLASS="brod">94</TD>
<TD ALIGN="center" CLASS="brod">95</TD>
<TD ALIGN="center" CLASS="brod">96</TD>
<TD ALIGN="center" CLASS="brod">97</TD>
<TD ALIGN="center" CLASS="brod">98</TD>
<TD ALIGN="center" CLASS="brod">99</TD>
<TD ALIGN="center" CLASS="brod">00</TD>
<TD ALIGN="center" CLASS="brod">01</TD>
<TD ALIGN="center" CLASS="brod">02</TD>
<TD ALIGN="center" CLASS="brod">03</TD>
<TD ALIGN="center" CLASS="brod">04</TD>
</TR>
<TR>
<TD COLSPAN="100" CLASS="brod"><IMG SRC="iconer/tonlinje.gif"></TD>
</TR>
<TR>
<TD COLSPAN="100" CLASS="brod"><IMG SRC="iconer/tonlinje.gif"></TD>
</TR>
<%
manufacturer = RecSet("Marke")
end if
BG = "GrayLite"
Set Rmc = server.CreateObject("ADODB.recordset")
MC = "select * FROM RegisterModell where Prio = 1 AND VisaIGrid = 'ja' AND Marke = '" & manufacturer & "' ORDER BY Model"
Rmc.open MC, connect
DO UNTIL Rmc.EOF
'****************| koden för att räkna ut antalat av modellen i lager |****************
Set LagerCount = server.CreateObject("ADODB.recordset")
SelectLager = "select * FROM motorcyklar WHERE salestatus = 0 and registerID =" & Rmc("ID")
LagerCount.open SelectLager, connect
Lager = 0
DO UNTIL LagerCount.EOF
Lager = Lager + 1
LagerCount.MoveNext
Loop
LagerCount.Close
set lagerCount = nothing
'*************************************************************************************
%>
<TR CLASS="<%=BG%>">
<TD WIDTH="100"><%=Rmc("Model")%></TD>
<TD><%=Rmc("Prio")%></TD>
<TD ALIGN="CENTER"><%=Lager%></TD>
<%
'=======================================================================
'Skriver ut de olika årsmodellerna
'=======================================================================
Set RY = server.CreateObject("ADODB.recordset")
YR = "select * from GridYear WHERE ModelID =" & Rmc("ID")
RY.open YR, connect
DO UNTIL RY.EOF
%>
<TD ALIGN="center"><%=RY("Price")%></TD>
<%
RY.MoveNext
Loop
%>
</TR>
<%
'---------Sätter olika färger på varanan rad------------
IF BG = "GrayLite" THEN BG = "GrayDark" ELSE BG = "GrayLite" END IF
'-------------------------------------------------------
Rmc.MoveNext
Loop
Rmc.Close
set rmc = nothing
%>
<%
RecSet.MoveNext
Loop
Recset.Close
%>
Denna kod skriver nu ut alla modeller under rätt märke, MEN av någon anledning kommer det flera av samma modell ett antal gångerunder varje märke... ex. under suzuki kommer:
SV 650 N
SV 650 S
VL 800 Volusia
VZ 800 Marauder
SV 650 N
SV 650 S
VL 800 Volusia
VZ 800 Marauder
SV 650 N
SV 650 S
VL 800 Volusia
VZ 800 Marauder
SV 650 N
SV 650 S
VL 800 Volusia
VZ 800 Marauder
är det någon som kan se felet? jag känner mig blind just nu, hur mycket jag än går igenom koden hittar jag det inte :/
Jag tror du missförstod lite! :)
Tricket med if-satsen i loopen var att du inte behöver hämta modellerna i en separat selectsats utan de hämtas samtidigt. Du behöver heller inte ha en separat selectsats för att räkna cyklarna. Slå ihop alla tre till en gemensam och försök få till det därifrån.
Selecten bör se ut något liknande:
sel = "SELECT *, (SELECT COUNT(*) FROM motorcyklar AS mot WHERE mot.salestatus = 0 AND mot.registerID = rmo.ID) AS Stock FROM RegisterMarken AS rma INNER JOIN RegisterModell AS rmo ON rma.ID = rmo.BrandID WHERE rmo.Prio = 1 And rmo.VisaIGrid = 'ja' ORDER BY rma.Marke ASC, rmo.Modell ASC"
och lite exempelkod:
Dim manufacturer
manufacturer = ""
Response.Write("<tr><th>Märke/Modell</th><th>Lager</th></tr>")
DO UNTIL RecSet.EOF
If manufacturer <> RecSet("Marke") Then
Response.Write("<tr><td>" & RecSet("Marke") & "</td></tr>")
End If
Response.Write("<tr><td>" & RecSet("Modell") & "</td><td>" & RecSet("Stock") & "</td></tr>")
En till sak
Okej, nu har jag skrivit om och nu får jag motorcyklarna att listas korrekt, men jag har fortfarande ett problem. Jag måste också få ut priset i euro efter varje årsmodell...
kan man kanske göra detta enkelt med en for-loop eller? I tabellen gridyear finns motorcykelns id, årsmodell och pris. det ska skrivas ut ett pris för varje årsmodell, ex.
Suzuki | Prio | Lager | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 00 | 01 | 02 | 03 | 04
och här under ska det stå ett pris för varje årtal m.m.
eller går det att smälla ihop även detta med föregående?
här är ett exempel på hur jag tänker, jag vet att det finns fel då jag inte är så duktig med asp än.
<%
'=======================================================================
'Skriver ut de olika årsmodellerna
'=======================================================================
For count = 1990 to 2004
YR = "select * FROM GridYear INNER JOIN RegisterModell AS rmo ON GridYear.ModelID = rmo.ID WHERE rmo.Prio = 1 And rmo.VisaIGrid = 'ja' AND GridYear.Year = " & count & " ORDER BY rmo.Marke ASC, rmo.Model ASC"
%>
<TD ALIGN="center"><%=YR("Price")%></TD>
<%
Next
%>
Sanji skrev:
eller går det att smälla ihop även detta med föregående?
Ja, smäll ihop bara! :)
Det blir lite finlir när du ska rita ut det hela bara men det ska du nog få till.
sel = "
SELECT *, (
SELECT COUNT(*)
FROM motorcyklar AS mot
WHERE mot.salestatus = 0 AND mot.registerID = rmo.ID) AS Stock
FROM RegisterMarken AS rma
INNER JOIN RegisterModell AS rmo ON rma.ID = rmo.BrandID
INNER JOIN GridYear AS grd ON grd.ModellID = rmo.ID
WHERE rmo.Prio = 1 And rmo.VisaIGrid = 'ja'
ORDER BY rma.Marke ASC, rmo.Modell ASC"
(jag slog isär raderna bara för att se tydligare)
Dim manufacturer, model, gridYearStart, gridYearEnd
manufacturer = ""
model = ""
gridYearStart = 1990
gridYearEnd = Year(Now())
Response.Write("<tr><th>Märke/Modell</th><th>Lager</th>)
For gridYearStart to gridYearEnd
Response.Write("<th>" & gridYearStart & "</th>")
Next
Response.Write("</tr>")
DO UNTIL RecSet.EOF
If manufacturer <> RecSet("Marke") Then
Response.Write("<tr><td colspan=""" & gridYearEnd-gridYearStart & """>" & RecSet("Marke") & "</td></tr>")
End If
Response.Write("<tr><td>" & RecSet("Modell") & "</td><td>" & RecSet("Stock") & "</td>")
gridYearStart = 1990
model = RecSet("Modell")
For gridYearStart to gridYearEnd
Response.Write("<td>" & RecSet("Price") & "</td>")
If RecSet.Eof Then Exit For
RecSet.MoveNext()
If model <> RecSet("Modell") Then
RecSet.MovePrevious()
Exit For
End If
Next
If gridYearStart < gridYearEnd Then
For gridYearStart to gridYearEnd
Response.Write("<td></td>")
Next
End If
Response.Write("</tr>")
Jag har dock semester så vissa fel kan ha smugit sig in i koden men du får nånting att labba med i alla fall! ;)
Tack så mycket! nu ska det testas :)
nu är det något problem med min sql-sats. min webläsare klagar på:
[Microsoft][ODBC Microsoft Access Driver] Syntax error (missing operator) in query expression 'rma.ID = rmo.BrandID INNER JOIN GridYear AS grd ON grd.ModellID = rmo.ID'
sel = "SELECT *, (SELECT COUNT(*) FROM motorcyklar AS mot WHERE mot.salestatus = 0 AND mot.registerID = rmo.ID)
AS Stock FROM RegisterMarken AS rma
INNER JOIN RegisterModell AS rmo ON rma.ID = rmo.BrandID
INNER JOIN GridYear AS grd ON grd.ModellID = rmo.ID
WHERE rmo.Prio = 1 And rmo.VisaIGrid = 'ja' ORDER BY rma.Name ASC, rmo.Model ASC"
Löst detta problem, men fått andra ^^ Jag fick skriva om min select-kod lite innan det funkade:
sel = "SELECT *, (SELECT COUNT(*) FROM motorcyklar AS mot WHERE mot.salestatus = 0 AND mot.registerID = rmo.ID)
AS Stock FROM RegisterMarken AS rma INNER JOIN (GridYear AS grd INNER JOIN RegisterModell AS rmo ON grd.ModelID = rmo.ID)
ON rma.ID = rmo.BrandID
WHERE rmo.Prio = 1 And rmo.VisaIGrid = 'ja' ORDER BY rma.Name ASC, rmo.Model ASC"