FAQ |
Kalender |
![]() |
#1 | |||
|
||||
Har WN som tidsfördriv
|
I ett bloggsystem jag håller på med just nu så hämtar jag inläggen till startsidan med:
Kod:
SELECT `posts`.id,`posts`.title,`posts`.text,`posts`.tags,`posts`.user_id,DATE_FORMAT(`posts`.date,'%e %b %Y %H:%i') AS newdate FROM `posts` WHERE MONTH(`date`)=MONTH(NOW()) ORDER BY `date` DESC LIMIT 5; |
|||
![]() |
![]() |
![]() |
#2 | ||
|
|||
Klarade millennium-buggen
|
Visst går det, det är så här enkelt:
Kod:
SELECT `posts`.id, `posts`.title, `posts`.text, `posts`.tags, `posts`.user_id,DATE_FORMAT(`posts`.date,'%e %b %Y %H:%i') AS newdate, `users`.uname FROM `posts`, `users` WHERE MONTH(`date`)=MONTH(NOW()) AND `posts`.user_id = `users`.user_id ORDER BY `date` DESC LIMIT 5; |
||
![]() |
![]() |
![]() |
#3 | |||
|
||||
Har WN som tidsfördriv
|
Tack så hemskt mycket! Funkar perfekt!
|
|||
![]() |
![]() |
![]() |
#4 | ||
|
|||
Klarade millennium-buggen
|
Citat:
Ett annat lite skojigt sätt att nå samma resultat är att använda en subselect: Kod:
SELECT `posts`.id, `posts`.title, `posts`.text, `posts`.tags, `posts`.user_id,DATE_FORMAT(`posts`.date,'%e %b %Y %H:%i') AS newdate, (SELECT `users`.uname FROM `users` WHERE `posts`.user_id = `users`.user_id) AS uname FROM `posts` WHERE MONTH(`date`)=MONTH(NOW()) ORDER BY `date` DESC LIMIT 5; |
||
![]() |
![]() |
![]() |
#5 | ||
|
|||
Klarade millennium-buggen
|
Conny du kanske skall berätta vilken form av join du gör, när du nämner "join",
Det finns flera olika join ( http://en.wikipedia.org/wiki/Join_(SQL) ) Den form av join du har beskrivit ovan är "INNER JOIN" |
||
![]() |
![]() |
![]() |
#6 | ||
|
|||
Klarade millennium-buggen
|
Citat:
I just detta fall så var det en av de enklaste JOINarna man kan jobba med när man kopplar samman två tabeller med primärnyckel i users-tabellen och främmande nyckeln i posts-tabellen. Jag gissade dessutom på att det fanns en kolumn i users-tabellen som heter user_id vilket visade sig stämma. Det var inte givet i förutsättningarna. Man får ta det här med JOIN steg för steg för man kan ju även använda nyckelorden "INNER JOIN", "OUTER JOIN" resp "JOIN", men det är mycket databasspecifikt hur detta serut i verkligheten och jag hade inte min MySQL igång så jag kunde testa ut en helt optimal lösning. När crazzy upptäcker vilka fantastiska lösningar man kan göra med SQL hoppas jag han återkommer med fler frågor, det är kul att knäcka problem med SQL och DDL. |
||
![]() |
![]() |
![]() |
#7 | |||
|
||||
Har WN som tidsfördriv
|
Nja, primärnyckeln i `users`heter iofs `id` men ändå. SQL är riktigt skoj när man sitter och försöker pressa in så mycket jobb som möjligt i SQL och tvinga databasen att göra allt drygt. Datumformatering, sökning, strängmatchning, sortering, räkning.....
|
|||
![]() |
![]() |
![]() |
#8 | ||
|
|||
Klarade millennium-buggen
|
Citat:
|
||
![]() |
![]() |
![]() |
#9 | ||
|
|||
Klarade millennium-buggen
|
Bra att tänka på när man designar databaser är att göra så mycket jobb som möjligt med beräkningar, urval, sortering mm i mysql istället för i sidscriptet. Mycket snabbare och oftast lättare att koda.
|
||
![]() |
![]() |
![]() |
#10 | ||
|
|||
Klarade millennium-buggen
|
Citat:
Ett annat tips är att skapa vyer med komplicerat SQL-kod då minskar man risken att man kodar fel i SQL-satsen på sidscriptet. Detta är synnerligen bra om man har komplex SQL eller om man anropar den på flera olika ställen i scriptkod. Syntax: http://dev.mysql.com/doc/refman/5.0/en/cre...reate-view.html Kod:
CREATE TABLE tblInvoice (qty INT, price INT); INSERT INTO tblInvoice VALUES(3, 50); CREATE VIEW vInvoice AS SELECT qty, price, qty*price AS value FROM tblInvoice; SELECT * FROM vInvoice; +------+-------+-------+ | *qty* | *price | value | +------+-------+-------+ | * *3 * | * *50 *| * 150 *| +------+-------+-------+ Kod:
CREATE VIEW vPosts AS SELECT `posts`.id, `posts`.title, `posts`.text, `posts`.tags, `posts`.user_id,DATE_FORMAT(`posts`.date,'%e %b %Y %H:%i') AS newdate, (SELECT `users`.uname FROM `users` WHERE `posts`.user_id = `users`.user_id) AS uname FROM `posts` WHERE MONTH(`date`)=MONTH(NOW()) ORDER BY `date` DESC LIMIT 5; För att anropa denna vy skriver man bara: Kod:
SELECT * FROM vPosts; |
||
![]() |
![]() |
Svara |
|
|