webForumDet fria alternativet

SQLfråga samt sortering med asp

ASP

20 svar · 234 visningar · startad av erka

Medlem sedan dec. 19996 522 inlägg
Frågan#1

Hej ett litet problem igen...

Det är så att jag har en nyhets DB med nyheter på 5 olika språk. Ja
g har 2 tabeller, en som heter News och en som heter NewsContent

Först ska jag skriva ut alla nyheter som finns på engelska och är det=
någon nyhet som inte finns på engelska men på tex svenska så ska d=
en komma under alla de engelska nyheterna

Typ så här

News that exists in English 
Loopa igenom alla nyheter som finns på engelska 

News that exists in Swedish
Loopa igenom alla nyheter som finns på svenska men inte på engelska 

Sedan vidare och gör samma sak om det finns några nyheter som inte finns på engelska eller tidigare loopat språk

Tabellerna ser ut så här: '

NEWS 
-NewsID 
-NewsInsertDate 
-NewsPublishDate 
-NewsRemoveDate 

NEWSCONTENT 
-NewsID 
-NewsLanguageID 
-NewsHeader 
-NewsContent 
-NewsAuthor 
-NewsPicture

Där News.NewsID är en relation till NewsContent.NewsID (en till många=
)

Förstår ni vad jag är ute efter ?

Just nu har jag frågan

SQLStmt = "SELECT NewsContent.NewsId, Distinct(NewsContent.NewsLanguageid), NewsContent.NewsHeader, News.NewsId,"_
	& "News.NewsInsertdate FROM News INNER JOIN NewsContent ON News.NewsId = NewsContent.NewsId "

/erka

------------------
1 Man, 1 Million dead, The odds are just about even - Ash

Medlem sedan dec. 200012 464 inlägg
#2

Om du lägger till en kolumn, sortOrder i languagetabellen som anger i vilken ordning man skall välja språk så kan man skriva en fråga enligt följande

select news,sortOrder
  from news n inner join newsContent nc on nc.id = n.id
            inner join language l on nc.lang = l.lang
  where nc.id not in (select id from newsContent
                       where lang < nc.lang) order by sortOrder

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

Medlem sedan dec. 19996 522 inlägg
#3

Hur menar du då ? i den tabellen finns ju flera av samma artiklar fast på olika språk, blir inte det väldigt mycket dubbel information, inte vidare normaliserat..

------------------
1 Man, 1 Million dead, The odds are just about even - Ash

Medlem sedan dec. 200012 464 inlägg
#4

Jag menade inte tabellen newsContent utan att du har en separat tabell med två kolumner ocah att det är kopplat till

NewsLanguageId!language!sortorder
---------------------------------
19.............!English!1
47.............!Swedish!2
11.............!Spanish!3
22.............!French.!4

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

Medlem sedan dec. 19996 522 inlägg
#5

Nu har jag koden

	SQLStmt = "select news,sortOrder "_
	& "from news n inner join newsContent nc on nc.id = n.id inner join language l on nc.lang = l.lang"_
	& " where nc.id not in (select id from newsContent where lang < nc.lang) order by sortOrder"

och tabellerna

NEWS 
-NewsID  (text)
-NewsInsertDate  (text)
-NewsPublishDate  (text)
-NewsRemoveDate  (text)

NEWSCONTENT 
-NewsID (tal)
-NewsLanguageID (text)
-NewsHeader  (text)
-NewsContent  (text)
-NewsAuthor  (text)
-NewsPicture (text)

SORTORDER
-NewsLanguageID(text)
-Language (text)
-SortOrder (tal)

NewsLanguageID är typ se, gb, es, fi etc. Jag får nu felmeddelandet

Microsoft][ODBC Microsoft Access Driver] Syntax error (missing operator) in query expression 'nc.id = n.id inner join language l on nc.lang = l.lang'.

Missing operator ?

------------------
1 Man, 1 Million dead, The odds are just about even - Ash

Medlem sedan dec. 19996 522 inlägg
#6

satt å lekte med access men det vill sig inte

SELECT News.NewsId, NewsContent.NewsId, NewsContent.NewsLanguageid, NewsContent.NewsHeader, SortOrder.NewsLanguageId, SortOrder.Language, SortOrder.Sortorder FROM SortOrder INNER JOIN (News INNER JOIN NewsContent ON News.NewsId = NewsContent.NewsId) ON SortOrder.NewsLanguageId = NewsContent.NewsLanguageid WHERE NewsContent.NewsId NOT IN (SELECT NewsId FROM NewsContent WHERE NewsId < Newscontent.LanguageId) ORDER BY SortOrder

är jag helt ute åp cyklar

------------------
1 Man, 1 Million dead, The odds are just about even - Ash

Medlem sedan dec. 200012 464 inlägg
#7

Access är lite besvärligt när man skriver joins. Det brukar behövas lite parenteser

select news,sortOrder
from (news n inner join newsContent nc on nc.newsId = n.newsId)
inner join sortOrder l on nc.newsLanguageId = l.newsLanguageId
where nc.newsId not in (select newsId from newsContent
where newsLanguageId  in (select newsLanguageid from sortOrder 
where sortOrder < l.sortOrder )) order by sortOrder

Jag gjorde en miss i min förra fråga. Den fugerade bara om om newsLanguageId kom i samma ordning som sortOrder. Jag skrev om frågan så nu skall det enbart bero på sortOrder.

red: glömde order by
------------------
essentitia preter non sans multiplicandum

[Redigerat av LarsG den 06 jul 2001]

Medlem sedan dec. 19996 522 inlägg
#8

Ska prova snart. Tack så mycket, vart kan man läsa om access och join funktioner, vet du det också kanske ;) tack så himmla mycket

------------------
1 Man, 1 Million dead, The odds are just about even - Ash

Medlem sedan dec. 200012 464 inlägg
#9

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnacc2k/html/acintsql.asp

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

Medlem sedan dec. 19996 522 inlägg
#10

Fan letade ju där, tack !

------------------
1 Man, 1 Million dead, The odds are just about even - Ash

Medlem sedan dec. 19996 522 inlägg
#11

Hej igen. Får nu felmeddelandet

Microsoft OLE DB Provider for ODBC Drivers error '80040e10' 

[Microsoft][ODBC Microsoft Access Driver] Too few parameters. Expected 1. 

/webtools/News.asp, line 137

Men hittar inget som är fel

när jag skriver ut sqlstmt:en får jag

SELECT News, SortOrder FROM (news n inner join newsContent nc on nc.newsId = n.newsId)inner join sortOrder l on nc.newsLanguageId = l.newsLanguageId WHERE nc.newsId not in (SELECT newsId from newsContent WHERE newsLanguageId in (SELECT newsLanguageid from sortOrder WHERE sortOrder < l.sortOrder )) ORDER BY sortOrder

Måntro vad kan va fel ?

------------------
1 Man, 1 Million dead, The odds are just about even - Ash

Medlem sedan dec. 200012 464 inlägg
#12

Det brukar oftast bero på att något kolumnnamn är felaktigt.

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

Medlem sedan dec. 19996 522 inlägg
#13

Jo det är det jag har letat efter. Men kan lixom inte bara hitta det. Inget är väll reserverat, news eller sortorder kanske men inte så vitt jag vet.

Ser inte något konstigt med denna

SQLStmt = "SELECT News, Sortorder FROM (News n INNER JOIN NewsContent nc on nc.NewsId = n.NewsId) INNER JOIN Sortorder l ON nc.NewsLanguageid = l.NewsLanguageId WHERE nc.NewsId NOT IN (SELECT NewsId FROM NewsContent WHERE NewsLanguageid IN (SELECT NewsLanguageId FROM Sortorder WHERE Sortorder < l.Sortorder)) ORDER BY Sortorder"

------------------
1 Man, 1 Million dead, The odds are just about even - Ash

Medlem sedan okt. 20005 273 inlägg
#14

Alla reserverade SQL-utryck
http://www.webeye.nu/default2.asp?que=asp/default.asp&exec=asp/reserverade_ord_t-sql.asp

:h

------------------
ibland tror jag att jag kan lite för lite än vad jag kan ....

Medlem sedan dec. 19996 522 inlägg
#15

tackar, inget där som jag trodde. har nu gått igenom hela SQLStmten mot dbn 100 ggr och kan inte hitta något fel, vad kan det annars bero på ?
tack

/erka

------------------
1 Man, 1 Million dead, The odds are just about even - Ash

Medlem sedan dec. 19996 522 inlägg
#16

LarsG, du skrev

select news,sortOrder
from (news n inner join newsContent nc on nc.newsId = n.newsId)
inner join sortOrder l on nc.newsLanguageId = l.newsLanguageId
where nc.newsId not in (select newsId from newsContent
where newsLanguageId in (select newsLanguageid from sortOrder 
where sortOrder < l.sortOrder )) order by sortOrder

vad betyder SELECT news,sortOrder
from När News och SortOrder är namnet på 2 tabeller i DB:n.

Skriver jag

select *
from (news n inner join newsContent nc on nc.newsId = n.newsId)
inner join sortOrder l on nc.newsLanguageId = l.newsLanguageId
where nc.newsId not in (select newsId from newsContent
where newsLanguageId in (select newsLanguageid from sortOrder 
where sortOrder < l.sortOrder )) order by sortOrder

så får jag fram något, men vad exakt är det jag får fram ?

tacksam
/erka

------------------
1 Man, 1 Million dead, The odds are just about even - Ash

Medlem sedan dec. 19996 522 inlägg
#17

Nu får jag ju ut rätt genom att ta * istället för skriva som du larsG, men hur kan jag göra så jag skriver ut Först namnet på språket en gång sedan loopar jag
sedan namnen på nästa språk i sortorder listan och loopa där..

om du orkar..

/erka

------------------
1 Man, 1 Million dead, The odds are just about even - Ash

Medlem sedan dec. 200012 464 inlägg
#18

Du får alltså ut data så här

en!News Item 1!...
en!News Item 3!...
fi!News item 2!...

Om du bara vill skriva ut språk en gång, så får du själv i din VB-kod hålla reda på när man byter språk.

language = ""
sql = "..."
set rs = connect.execute(sql)

while not rs.eof
  if  Cstr(language) <> Cstr(rs("language") then
      language = rs("language")
      response.write language & "<br>"
  end if
'skriv övrigt data
rs.movenext
wend

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

Medlem sedan dec. 19996 522 inlägg
#19

Ohh tack nu åter står bara ett problem.. ;)

Det är att jag anväder mig av getrows..Jag har sökt lite men inte lyckats förstå hur jag ska göra liknande som while not rs.eof med den koden jag använder nu

	SQLStmt = "SELECT * FROM (News n INNER JOIN NewsContent nc on nc.NewsId = n.NewsId) "_
	& "INNER JOIN SortOrder l ON nc.NewsLanguageid = l.NewsLanguageId WHERE nc.NewsId "_
	& "NOT IN (SELECT NewsId FROM NewsContent WHERE NewsLanguageid IN "_
	& "(SELECT NewsLanguageId FROM SortOrder WHERE Sortorder < l.Sortorder)) ORDER BY SortOrder"	 
	 
	Response.Write"<br>"
	SET RS = Connect.Execute(SQLStmt)
	
	Dim ArrRS, a, i, Number , rs2, ArrRs2, CountryRep
	ArrRS = RS.GetRows()
	RS.Close
	Set RS = Nothing
	
		For i = 0 to ubound(ArrRS,2)
			Number = ArrRS(0, i) 
			CountryRep = ArrRS(5, i)
			SQLStmt2 = "SELECT * FROM NewsContent WHERE NewsID = "& Number &""
			SET RS2 = Connect.Execute(SQLStmt2)
			ArrRS2 = RS2.GetRows()
			RS2.Close
			Set RS2 = Nothing
			Response.Write ArrRS(6, i) &" (published: "& ArrRS(2, i) &")<br>"
			Response.Write"Existing languages: " 
			For a = 0 to ubound(ArrRS2,2)
			Response.Write"<img src=""/bin/images/flags/"& ArrRS2(1, a) &".gif"">"_
						 &"<img src=""/bin/images/flags/1x1vit.gif"">"
			Next
		Response.Write"<br><a href=""view.asp?documentID=News&catID=wt&Action=AddStep1&NewsID="& ArrRS(0, i) &""_
						& """>Add new language version</a><br><br>"

		Next

Vet du det också kanske ;) tackar i alla fall för hjälpen

------------------
1 Man, 1 Million dead, The odds are just about even - Ash

Medlem sedan dec. 19996 522 inlägg
#20

fattar ju att jag måste sätta ett värde som sätts på 0 vid varje nytt land som kollas igenom. Sedan öka den med ett för varje nyhetsid jag går igenom. Och kolla av den i varje loop så att säga. Men hur fean skriver man det, det är frågan

------------------
1 Man, 1 Million dead, The odds are just about even - Ash

271 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
130 ms — deklarationer (db)
0 ms — hämta statistik (cache)
138 ms — hämta tråd, inlägg och bilagor (db)
128 ms — ändringar (db)