Avatar billede sorensen_123 Nybegynder
10. februar 2008 - 19:24 Der er 19 kommentarer og
2 løsninger

Find seneste aktivitet over flere tabeller.

Jeg vil gerne finde de 10 seneste punkter fra 2 forskellige databaser.

Jeg har en database der hedder bids, og en der hedder notices.

I hver database er der en række der hedder ID og NAVN og en række der hedder TIMESTAMP som indeholder et standard timestamp for hver post i tabellen.

Hvordan henter jeg flettet den seneste aktivitet ud fra de timestamps?

Eks.:
1) En bruger opretter en tabel i notices med ID = 1 og NAVN = "Nr. 1".
2) Derefter opretter brugeren en tabel i BIDS med ID = '1' og NAVN = "Bud 1".
3)Derefter opretter brugeren en tabel i notices med ID = '5' og NAVN = "Nr. 25"

Dvs. at scriptet skal liste sådan:
1) Nr. 25
2) Bud 1
3) Nr. 1
osv osv.

Det skal ikke være sådan at den først henter f.eks. de sidste 5 fra notices og sidste 5 fra bids.. Den skal nærmest "flette" dem efter hvornår de blev lavet.

Hvordan gøres det?? Har prøvet med mysql_query("SELECT bids.*, notices.* FROM bids, notices WHERE bids.userid = '$_SESSION[userid]' AND notices.userid = '$_SESSION[userid]' ORDER BY timestamp"); men det resulterer ingen poster.
Avatar billede nielle Nybegynder
10. februar 2008 - 20:33 #1
Sådan?

SELECT * FROM
(
SELECT navn, timestamp FROM bids WHERE userid = '$_SESSION[userid]' ORDER BY timestamp DESC LIMIT 10
UNION
SELECT navn, timestamp FROM notices userid = '$_SESSION[userid]' ORDER BY timestamp DESC LIMIT 10
)
ORDER BY timestamp DESC LIMIT 10
Avatar billede jakobdo Ekspert
10. februar 2008 - 20:36 #2
Kunne du ikke lave noget i stil med:

SELECT * FROM `tbl_818877_a`
UNION
SELECT * FROM `tbl_818877_b`
ORDER BY TIMESTAMP
Avatar billede jakobdo Ekspert
10. februar 2008 - 20:36 #3
Note til Jakobdo: Husk F5 inden du poster...
Avatar billede nielle Nybegynder
10. februar 2008 - 20:48 #4
Over en time siden at spørgsmålet blev postet ... man skulle tro at der var tid nok til at vi kunne ramme ved siden af hinanden? ;^)
Avatar billede nielle Nybegynder
10. februar 2008 - 20:49 #5
Forresten mangler jeg en WHERE i den ene SELECT.
Avatar billede jakobdo Ekspert
10. februar 2008 - 20:59 #6
nielle:
Giver denne løsning ikke det samme som din løsning:

SELECT *
FROM `tbl_818877_a` WHERE userid = '$_SESSION['userid']'
UNION
SELECT *
FROM `tbl_818877_b` WHERE userid = '$_SESSION['userid']'
ORDER BY datotid
LIMIT 10
Avatar billede sorensen_123 Nybegynder
10. februar 2008 - 21:16 #7
Jakobdo: Den sidste kode du sendte fremkalder denne fejl: "The used SELECT statements have a different number of columns".
Avatar billede jakobdo Ekspert
10. februar 2008 - 21:18 #8
Ok, så skal det nok være Nielle's løsning.
Har desværre ikke data til at teste det lige nu.
Avatar billede sorensen_123 Nybegynder
10. februar 2008 - 21:19 #9
Det skal så også lige siges at der er flere tabeller i min notices, så union virker selvfølgelig ikke..
Avatar billede jakobdo Ekspert
10. februar 2008 - 21:26 #10
Så skal du rette *'erne til de få data du vil have trukket ud.
Og det du trækker ud og til sidst joiner, skal være de samme felter.
Som f.eks. ID, navn og timestamp
Avatar billede nielle Nybegynder
10. februar 2008 - 22:27 #11
Felterne i de to SELECTS i UNION'en skal hedde det samme og være af samme datatype. Hvis navnene er forskellige kan du bruge AS til at ændre deres navn.
Avatar billede sorensen_123 Nybegynder
11. februar 2008 - 14:40 #12
Får følgende fejl:
"Incorrect usage of UNION and ORDER BY";

I denne kode:
$getLatestAct = mysql_query("
SELECT id, timestamp FROM
(
SELECT id, timestamp FROM bids WHERE userid = '$_SESSION[userid]' ORDER BY timestamp DESC LIMIT 10
UNION
SELECT id, timestamp FROM notices userid = '$_SESSION[userid]' ORDER BY timestamp DESC LIMIT 10
)
ORDER BY timestamp DESC LIMIT 10
")or die(mysql_error());

Hvad kan være galt?
Avatar billede jakobdo Ekspert
11. februar 2008 - 14:48 #13
Du manger WHERE imellem:
FROM notices <---> userid =

I linjen:
SELECT id, timestamp FROM notices userid = '$_SESSION[userid]' ORDER BY timestamp DESC LIMIT 10
Avatar billede sorensen_123 Nybegynder
11. februar 2008 - 16:23 #14
Får samme fejl, selvom jeg har rettet det...

Min kode:
$getLatestAct = mysql_query("
SELECT id, timestamp FROM
(
SELECT id, timestamp FROM bids WHERE userid = '$_SESSION[userid]' ORDER BY timestamp DESC LIMIT 10
UNION
SELECT id, timestamp FROM notices WHERE userid = '$_SESSION[userid]' ORDER BY timestamp DESC LIMIT 10
)
ORDER BY timestamp DESC LIMIT 10
")or die(mysql_error());
Avatar billede sorensen_123 Nybegynder
11. februar 2008 - 17:52 #15
Fandt selv ud af det med en anden kode.

Smid begge et svar, jakobdo og nielle. Så får i 50 point hver.
Avatar billede nielle Nybegynder
11. februar 2008 - 18:10 #16
Hvordan så løsningen så ud?
Avatar billede sorensen_123 Nybegynder
11. februar 2008 - 18:16 #17
Den så således ud:
mysql_query("
SELECT id, timestamp, latestActId FROM bids WHERE userid = '$_SESSION[userid]'
UNION ALL
SELECT id, timestamp, latestActId FROM notices WHERE userid = '$_SESSION[userid]'
ORDER BY timestamp DESC
LIMIT 10
")or die(mysql_error());
Avatar billede jakobdo Ekspert
11. februar 2008 - 18:22 #18
Svar!
Avatar billede sorensen_123 Nybegynder
11. februar 2008 - 18:25 #19
Tak for hjælpen.
Avatar billede jakobdo Ekspert
11. februar 2008 - 18:25 #20
Takker for point.
Avatar billede nielle Nybegynder
12. februar 2008 - 16:28 #21
Takker for point.

Det burde ikke være nødvendig med 'ALL' ... det var nok de der LIMIT den brokkede sig over. Jeg havde inkluderet dem i et forsøg på at forbedre performance; Ingen grund til at lave en UNION på alt hvis man alligevel kun skulle have de 10 første rækker. Men hvis MySQL ikke acceptere den så er det jo lige meget. :^)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester