Kom ihåg mig?
Home Menu

Menu


MySQL: Hämta ett fält från en annan tabell också.

 
Ämnesverktyg Visningsalternativ
Oläst 2009-01-10, 18:46 #1
crazzys avatar
crazzy crazzy är inte uppkopplad
Har WN som tidsfördriv
 
Reg.datum: Aug 2007
Inlägg: 1 089
crazzy crazzy är inte uppkopplad
Har WN som tidsfördriv
crazzys avatar
 
Reg.datum: Aug 2007
Inlägg: 1 089
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?
crazzy är inte uppkopplad   Svara med citatSvara med citat
Oläst 2009-01-10, 19:20 #2
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
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.
Conny Westh är inte uppkopplad   Svara med citatSvara med citat
Oläst 2009-01-10, 19:36 #3
crazzys avatar
crazzy crazzy är inte uppkopplad
Har WN som tidsfördriv
 
Reg.datum: Aug 2007
Inlägg: 1 089
crazzy crazzy är inte uppkopplad
Har WN som tidsfördriv
crazzys avatar
 
Reg.datum: Aug 2007
Inlägg: 1 089
Tack så hemskt mycket! Funkar perfekt!
crazzy är inte uppkopplad   Svara med citatSvara med citat
Oläst 2009-01-10, 19:44 #4
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
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.
Conny Westh är inte uppkopplad   Svara med citatSvara med citat
Oläst 2009-01-10, 20:46 #5
Jonas Jonas är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Feb 2004
Inlägg: 3 364
Jonas Jonas är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Feb 2004
Inlägg: 3 364
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"
Jonas är inte uppkopplad   Svara med citatSvara med citat
Oläst 2009-01-10, 23:21 #6
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
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.
Conny Westh är inte uppkopplad   Svara med citatSvara med citat
Oläst 2009-01-11, 00:15 #7
crazzys avatar
crazzy crazzy är inte uppkopplad
Har WN som tidsfördriv
 
Reg.datum: Aug 2007
Inlägg: 1 089
crazzy crazzy är inte uppkopplad
Har WN som tidsfördriv
crazzys avatar
 
Reg.datum: Aug 2007
Inlägg: 1 089
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.....
crazzy är inte uppkopplad   Svara med citatSvara med citat
Oläst 2009-01-11, 01:44 #8
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
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.
Conny Westh är inte uppkopplad   Svara med citatSvara med citat
Oläst 2009-01-11, 13:34 #9
Magnus_A Magnus_A är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: May 2006
Inlägg: 2 604
Magnus_A Magnus_A är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: May 2006
Inlägg: 2 604
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.
Magnus_A är inte uppkopplad   Svara med citatSvara med citat
Oläst 2009-01-11, 14:25 #10
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
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;
Conny Westh är inte uppkopplad   Svara med citatSvara med citat
Svara


Aktiva användare som för närvarande tittar på det här ämnet: 1 (0 medlemmar och 1 gäster)
 

Regler för att posta
Du får inte posta nya ämnen
Du får inte posta svar
Du får inte posta bifogade filer
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG]-kod är
HTML-kod är av

Forumhopp


Alla tider är GMT +2. Klockan är nu 03:02.

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