WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   MySQL: Hämta ett fält från en annan tabell också. (https://www.wn.se/forum/showthread.php?t=34371)

crazzy 2009-01-10 18:46

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;
Men det är inte så bra eftersom jag inte vill ha idnumret på användaren som postade utan användarnamnet. Det finns i en annan tabell. "users" heter den tabellen. Och fältet i den heter "uname". Hur gör jag för att i samma query få med även användarnamnet? Går det ens?

Conny Westh 2009-01-10 19:20

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;

"Fenomenet" kallas för att man "joinar" två tabeller, det finns andra mer moderna sätt att skriva joinar men funktiionen är densamma.

crazzy 2009-01-10 19:36

Tack så hemskt mycket! Funkar perfekt!

Conny Westh 2009-01-10 19:44

Citat:

Originally posted by crazzy@Jan 10 2009, 19:36
Tack så hemskt mycket! Funkar perfekt!
Varsågod!

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;

Subselecten funkar dock bara om du ska hämta exakt ett värde från den andra tabellen. Vill du hämta fler värden så måste du ha en subselect för varje värde du vill hämta. Subselecten funkar bäst om du vill göra komplexa beräkningar eller annat skoj.

Jonas 2009-01-10 20:46

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"

Conny Westh 2009-01-10 23:21

Citat:

Originally posted by Jonas@Jan 10 2009, 20:46
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"

Jag ville inte göra det för kompicerat för crazzy eftersom han troligen inte känner skillnad mellan INNER JOIN och OUTER JOIN.

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.

crazzy 2009-01-11 00:15

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.....

Conny Westh 2009-01-11 01:44

Citat:

Originally posted by crazzy@Jan 11 2009, 00:15
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.....
Ja, SQL kan göra ganska mycket innan man ens får hem datat till applikationen. Det är smart att göra så för det blir hiskeligt snabbt.

Magnus_A 2009-01-11 13:34

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.

Conny Westh 2009-01-11 14:25

Citat:

Originally posted by Magnus_A@Jan 11 2009, 13:34
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.
... och så fungerar det likadant oavsett vilken applikation som anropar SQL-koden.

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;


Alla tider är GMT +2. Klockan är nu 18:54.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson