webForumDet fria alternativet

Optimera kod, slå ihop tre frågor till en?

Databaser & SQL

4 svar · 509 visningar · startad av MickeA.com

Medlem sedan feb. 20034 441 inlägg
Frågan#1

Hej,

Har idag ett script för att lista massa data från en MySQL (5.0) databas. Så här ser databasen ut:

[i]doc_lang[/i]
lang_id, INT
land_name, VARCHAR

[i]doc_access[/i]
user_id, INT
lang_id, INT

[i]doc_page[/i]
page_id, INT
page_parent, INT (alltid = 3 för tillfället)
page_name, VARCHAR

[i]doc_name[/i]
doc_id, INT
doc_parent, INT ([i]doc_page.page_id[/i])
doc_name, VARCHAR

[i]doc_content[/i]
cont_id, INT
cont_parentid, INT ([i]doc_name.doc_id[/i])
cont_language, INT ([i]doc_lang.lang_id[/i])
cont_text, TEXT
cont_updated, INT (UNIX_TIMESTAMP)

Det jag nu ska göra är att:

  • Hämta alla page_name, doc_name, lang_name (som man har behörighet att se)
  • Lista allt från doc_content som tillhör resp. sida / språk
  • Endast den senaste versionen från doc_content ska hämtas

Går det här att få ihop till en fråga med flera JOIN?
Just nu körs som sagt 3 olika sqlfrågor och sidan tar uppåt 2 minuter att ladda, och det är inte så effektivt.

Kör med PHP 5 / MySQL 5

Tack!

Medlem sedan feb. 20013 023 inlägg
#2

Den här borde fixa sista delfrågan:

select * from doc_content
dc1 where cont_updated=(select max(cont_updated) from doc_content dc2
where dc1.cont_id=dc2.cont_id)

Denna är sedan bara att joina mot de övriga tabellerna. OBS! Är inte van vid annat än T-SQL syntax.

Medlem sedan feb. 20034 441 inlägg
#3

Jo, det där är den del av frågan som jag redan har koll på, tack.
Det är "resten" som är lite problematiskt.

Medlem sedan dec. 20025 483 inlägg
#4
select p.page_name
     , n.doc_name
     , l.lang_name
  from doc_page p
inner
  join doc_name n
    on p.page_id = n.doc_parent
inner
  join doc_content c
    on n.doc_id = c.cont_parentid
inner
  join doc_lang l
    on c.cont_language = l.lang_id
 where l.lang_id
    in ( select lang_id
           from doc_access
          where user_id = <user-id> )
   and c.cont_updated
     = ( select max(cont_updated)
           from doc_content
          where cont_parentid = c.cont_parentid )
Medlem sedan feb. 20034 441 inlägg
#5

Det funkar nästan, kom på att det nog inte funkar med en fråga. Om ni kollar den bifogade bilden, så skrivs allt ut idag.

Det som är My account är page_name och Account updated är doc_name.

Där cont_id inte existerar för nuvarande cont_parentid samt cont_language ska en "tom" ruta likt den gråa dyka upp.

Måste även presentera alla språk innan varje kategori, så det är nog tveksamt om jag klarar mig på en fråga.

Problemet jag har nu är att jag loopar igenom alla doc_page och inuti den loopen har jag en for-loop där jag kör igenom alla språk och det är väldigt ooptimalt och säkert helt onödigt, men jag har slut på idéer.

Tacksam för några förslag.

screenshot.trans.overview.gif
258 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
126 ms — deklarationer (db)
0 ms — hämta statistik (cache)
129 ms — hämta tråd, inlägg och bilagor (db)
126 ms — ändringar (db)