Panelen



Forumnavigering
Senast inloggade
RSS
Sponsorer

Forum > Webbutveckling relaterat > Databaser och SQL

Chrillemeters SQL tråd

I denna tråd tänkte jag presentera ett problem och visa en lösning.
Ni får gärna skicka in egna frågor om sqlproblem ni stöter på, via PM eller mailen hello@christher.se
Så tar jag upp dett här sedan.

 

Hoppas detta uppskattas.

Kan man inte läsa och förstå min kod, kan man inte programmera - Christher Lenander
Redigerades av chrillemeter den 26 februari 2011. Läs tidigare inlägg.
Redigerades av chrillemeter den 26 februari 2011. Läs tidigare inlägg.
Redigerades av chrillemeter den 26 februari 2011. Läs tidigare inlägg.
Redigerades av chrillemeter den 26 februari 2011. Läs tidigare inlägg.
Redigerades av chrillemeter den 26 februari 2011. Läs tidigare inlägg.
Redigerades av chrillemeter den 25 februari 2011. Läs tidigare inlägg.
Redigerades av chrillemeter den 25 februari 2011. Läs tidigare inlägg.
ID: #20784 | Skapades: 2011-02-25 21:56:45 | Tråden har 12 svar och har lästs 503 gånger.

Lag och matcher


Två tabeller, en som heter teams och en som heter games.

Strukturen för tabellen teams

 id, team, suffix 


Innehåller
1, Djurgården, IF
2, Timrå, IK


Strukturen för tabellen games

 id, home, away 


Innehåller
1, 1, 2
2, 2, 1


Utskrtiften ska se ut så här

1, Djurgården IF - Timrå IK
2, Timrå IK - Djurgården IF

 

För att lösa det, måste vi använda oss av join, där teams tabellen används två gånger med olika alias,
och tabellen games används som join tabell. Vi måste även använda en funktion som heter CONCAT_WS.

Lösningen på problemet ser ut så här.

SELECT
    g.id,
    CONCAT_WS(' - ',         CONCAT_WS(' ', t1.team, t1.suffix),
        CONCAT_WS(' ', t2.team, t2.suffix)
    ) game
FROM
    teams t1
JOIN
    games g
ON
    (t1.id = g.home)
JOIN
    teams t2
ON 
    (t2.id = g.away);

Kan man inte läsa och förstå min kod, kan man inte programmera - Christher Lenander
Redigerades av chrillemeter den 28 februari 2011. Läs tidigare inlägg.
Redigerades av chrillemeter den 28 februari 2011. Läs tidigare inlägg.
Redigerades av chrillemeter den 28 februari 2011. Läs tidigare inlägg.
Redigerades av chrillemeter den 28 februari 2011. Läs tidigare inlägg.
Redigerades av chrillemeter den 28 februari 2011. Läs tidigare inlägg.
Redigerades av chrillemeter den 26 februari 2011. Läs tidigare inlägg.
Redigerades av chrillemeter den 26 februari 2011. Läs tidigare inlägg.
Redigerades av chrillemeter den 26 februari 2011. Läs tidigare inlägg.
Redigerades av chrillemeter den 26 februari 2011. Läs tidigare inlägg.
Redigerades av chrillemeter den 26 februari 2011. Läs tidigare inlägg.
Redigerades av chrillemeter den 26 februari 2011. Läs tidigare inlägg.
Redigerades av chrillemeter den 25 februari 2011. Läs tidigare inlägg.
Redigerades av chrillemeter den 25 februari 2011. Läs tidigare inlägg.
Redigerades av chrillemeter den 25 februari 2011. Läs tidigare inlägg.
Redigerades av chrillemeter den 25 februari 2011. Läs tidigare inlägg.
Redigerades av chrillemeter den 25 februari 2011. Läs tidigare inlägg.
Redigerades av chrillemeter den 25 februari 2011. Läs tidigare inlägg.
ID: #20785 | Skapades: 2011-02-25 22:09:18

Ett bra verktyg för just MySQL är MySQL Workbench
Det enda verktyg som du behöver för att administrera din MySQL server.

Lite vad man kan göra

  • Databasmodellering
  • Skriva SQL
  • Administrera användare och serverinställningarna.

 

Kan man inte läsa och förstå min kod, kan man inte programmera - Christher Lenander
Redigerades av chrillemeter den 28 februari 2011. Läs tidigare inlägg.
Redigerades av chrillemeter den 28 februari 2011. Läs tidigare inlägg.
ID: #20787 | Skapades: 2011-02-28 13:50:38

Timmie
Timmie

Gradering

#20788

Citerar chrillemeter:

Ett bra verktyg för just MySQL är MySQL Workbench
Det enda verktyg som du behöver för att administrera din MySQL server.

Lite vad man kan göra

  • Databasmodellering
  • Skriva SQL
  • Administrera användare och serverinställningarna.

 

Ett tips skulle va om du gick igenom hur man använder Workbench. Kommer ihåg när de kom och jag förstod inte mycket utav det. Tyckte och tycker fortfarande bättre om MySQL Administrator bara för att jag inte förstår Workbench.

För övrigt, bra initiativ, tror detta kan uppskattas.

ID: #20788 | Skapades: 2011-02-28 17:45:00

Citerar Timmie:

 

Ett bra verktyg för just MySQL är MySQL Workbench
Det enda verktyg som du behöver för att administrera din MySQL server.

Lite vad man kan göra

  • Databasmodellering
  • Skriva SQL
  • Administrera användare och serverinställningarna.

 

 

 

Ett tips skulle va om du gick igenom hur man använder Workbench. Kommer ihåg när de kom och jag förstod inte mycket utav det. Tyckte och tycker fortfarande bättre om MySQL Administrator bara för att jag inte förstår Workbench.

För övrigt, bra initiativ, tror detta kan uppskattas.

 

Bra förslag. Funderat på att göra en lathund med bilder, alternativt ljudlösa screencasts, där jag går igenom databasmodellering och Query delen, emd enklare exempel.

Kan man inte läsa och förstå min kod, kan man inte programmera - Christher Lenander
Redigerades av chrillemeter den 28 februari 2011. Läs tidigare inlägg.
ID: #20789 | Skapades: 2011-02-28 18:11:51

Timmie
Timmie

Gradering

#20790

För mig skulle det räcka med en enkel "Kom igång" guid då jag inte förstår ett jota utav Workbench.

ID: #20790 | Skapades: 2011-02-28 20:55:35

voigtan
voigtan

Gradering

#20791

Rätta mig om jag har fel, men det känns som det är som Access och Microsoft SQL Server Management, eller?

Hur man ställer en fråga: http://support.microsoft.com/kb/q555375
ID: #20791 | Skapades: 2011-02-28 21:02:37

Citerar voigtan:

Rätta mig om jag har fel, men det känns som det är som Access och Microsoft SQL Server Management, eller?

Något åt det hållet. Fast MS Access vet jag inte. Det är en Databas manager för MySQL.
Förut hade MySQL separata verktyg för allt, som MySQL Administrator, MySQL Query Browser osv.
Nu har dom slagit ihop allt till ett enda verktyg, vilket jag tycker är bra.

Kan man inte läsa och förstå min kod, kan man inte programmera - Christher Lenander
ID: #20792 | Skapades: 2011-02-28 21:10:13

Hultin
Hultin

Gradering

#20797

Denna tråden skall ögonen kika igenom med jämnamellanrum.

Har grundläggande kunskap i sql, tillräckligt för att få saker att fungera men går saker att göra smidigare, eller ännu bättre, effektivare(dvs snabbare) så är ju det toppen! Skall försöka förstå mig på redan postad info i hopp om att jag lär mig något.

Kanon initiativ !

 

Edit: Försöker klura ut ler mer specifikt vad som händer i koden ovan (teams) och undrar om du kanske skulle kunna förklara lite mer varför du gör som du gör, och om möjligt, varför man gör så? =)

... ORANGE HEARTS!
Redigerades av Hultin den 1 mars 2011. Läs tidigare inlägg.
ID: #20797 | Skapades: 2011-03-01 11:26:40

Citerar Hultin:

Denna tråden skall ögonen kika igenom med jämnamellanrum.

Har grundläggande kunskap i sql, tillräckligt för att få saker att fungera men går saker att göra smidigare, eller ännu bättre, effektivare(dvs snabbare) så är ju det toppen! Skall försöka förstå mig på redan postad info i hopp om att jag lär mig något.

Kanon initiativ !

 

Edit: Försöker klura ut ler mer specifikt vad som händer i koden ovan (teams) och undrar om du kanske skulle kunna förklara lite mer varför du gör som du gör, och om möjligt, varför man gör så? =)

 

Ska skriva en längre förklaring av lösningen.
Vad är det du inte förstår med teams tabellen? är det att den används två gånger?

Kan man inte läsa och förstå min kod, kan man inte programmera - Christher Lenander
ID: #20798 | Skapades: 2011-03-01 13:35:55

Tänkte förklara lite, hur sqlen fungerar. Har döpt om alias
för tabeller för att göra det lättare att förstå vad som görs.

teams
id, team, suffix
1, Djurgården, IF
2, Timrå, IK

games
id, home, away
1,1,2
2,2,1


SELECT
    Game.id AS 'Game ID',
    CONCAT_WS(' - ',
        CONCAT_WS(' ', Home.team, Home.suffix),
        CONCAT_WS(' ', Away.team, Away.suffix)
    ) 'Game'
FROM
    teams Home
JOIN
    games Game
ON
    (Home.id = Game.home)
JOIN
    teams Away
ON 
    (Away.id = Game.away);


Tabellen games håller reda på vilka team som spelar mot varandra, och vilket som spelar hemma och borta, genom att lagra teamens ID i kolumnerna, home och away.

Tabellen teams används två gånger men med olika alias, Home och Away. Det för att kunna koppla tabellen till de olika kolumnerna i games tabellen.

CONCAT_WS funktionen sätter ihop strängar, och i detta fall sätter den ihop en sträng som ser ut så här.
Team Suffix - Team Suffix 

Kan man inte läsa och förstå min kod, kan man inte programmera - Christher Lenander
ID: #20805 | Skapades: 2011-03-04 16:39:18

Fick reda på att det finns en riktigt bra sql funktion som heter GROUP_CONCAT() i MySQL.

Säg att vi har tre tabeller, users, skills och users_skills.
Nu vill vi lista alla users och deras skills. Det är inte så svårt.


SELECT
    u.name,
    s.title 'skill'
FROM
    rkj_users u 
JOIN
    rkj_users_skills us
ON
    (u.id = us.user_id)
JOIN
    rkj_skills s
ON
    (s.id = us.skill_id)


Då skulle vi få ett resultat som ser ut så här.


Resultatet ovan vill vi undervika, då vi får ut alla users flera gånger. Vad vi vill är att få 
ut en user / rad + alla user skills i en kolumn. Det är här funktionen GROUP_CONCAT() 
kommer till nytta. Vi måste gruppera users på user-id, då user-id är unikt för varje user.


SELECT
    u.name,
    GROUP_CONCAT(s.title, SEPARATOR ', ') 'skills'
FROM
    rkj_users u 
JOIN
    rkj_users_skills us
ON
    (u.id = us.user_id)
JOIN
    rkj_skills s
ON
    (s.id = us.skill_id)
GROUP BY
    u.id


Nu kommer resultatet se ut så här.

Kan man inte läsa och förstå min kod, kan man inte programmera - Christher Lenander
Redigerades av chrillemeter den 10 mars 2011. Läs tidigare inlägg.
Redigerades av chrillemeter den 10 mars 2011. Läs tidigare inlägg.
Redigerades av chrillemeter den 10 mars 2011. Läs tidigare inlägg.
Redigerades av chrillemeter den 10 mars 2011. Läs tidigare inlägg.
ID: #20849 | Skapades: 2011-03-10 22:13:59

Räkna ut antal inlägg användare har gjort sedan ett visst datum,
och sortera användare efter antal inlägg.

Klicka här för se sqlfrågan

Frågan hämtar information från två tabeller med en join.
Inga konstigheter med det. För att få ut poster från ett datum längre tillbaka
använder man antingen SUBDATE() eller INTERVAL.

Det är denna rad som ser till att hämta alla poster från 7 dagar bakåt.

p.post_date >= DATE(NOW() - INTERVAL 7 DAY)


Resultatet av frågan ser ut så här

Användaren "Bar Foo" har 2 inlägg, men det är bara ett som ligger innanför datumintervallet, och därför
visas det bara totalt "1" inlägg från användaren. Lika med "Foo Bar" som har gjort 3 inlägg, men bara
2 av dessa är gjorda inom datumintervallet.

Kan man inte läsa och förstå min kod, kan man inte programmera - Christher Lenander
Redigerades av chrillemeter den 12 mars 2011. Läs tidigare inlägg.
Redigerades av chrillemeter den 12 mars 2011. Läs tidigare inlägg.
Redigerades av chrillemeter den 12 mars 2011. Läs tidigare inlägg.
ID: #20853 | Skapades: 2011-03-12 12:00:23
© Copyright 2007-2009 Shadi Domat | Version 3.0 | Sidkarta | Policy