10. juni 2010 - 09:30Der er
6 kommentarer og 1 løsning
flere select fra samme tabel på en gang
Jeg sidder og roder med et udtrak fra en tabel, hvor jeg skal hente tingene over "max date" og "max date -1"
Det går også ganske fint, men grund til at der skal hentes over datoerne er at jeg skal bruge værdien fra en kolonne for 2 dage. Men jeg skal ikke bruge dem i samme kolonne.
Det vil sige dag 1 trækkes som table.navn as navn1 og dag 2 som table.navn as navn2 da der er en join i det også.
Giv os den join query du bruger og beskriv ogsaa tabellen du vil traekke ud fra. Det er nemmere at komme med forslag naar man har lidt konkret at gaa ud fra.
Lige nu trækker den over navn, når jeg har fået det til at virke skal det laves om til ID. ;o)
SQL select distinct Point.Navn, Point.Datoen, Point.Points, Medlem.Beskrivelse, Medlem.Navn from Point, Medlem where Point.Datoen =(select max(Datoen) from Point) and Point.Navn = Medlem.Navn order by Medlem.Navn
Det jeg mangler er at jeg trækker info ud på max date -1 som så kaldes PointsIGaar f.eks.
Således jeg kan sætte det op sådan her Navn - Beskrivelse - Points i dag - Points igår Poul Master 5 10 Per User 6 8
jimmydk, som jeg forklarer nedenfor mener jeg at dette query giver det resultat du er ude efter. Derfor opretter jeg dette som svar.
SELECT m.Navn, Beskrivelse, p_idag.Points AS Points_idag, p_igaar.Points AS Points_igaar FROM medlem m LEFT JOIN (SELECT * FROM point WHERE Datoen = (SELECT MAX(Datoen) FROM point)) AS p_idag ON m.Navn = p_idag.Navn LEFT JOIN (SELECT * FROM point WHERE Datoen = (SELECT SUBDATE((SELECT MAX(Datoen) FROM point), INTERVAL 1 DAY))) AS p_igaar ON m.Navn = p_igaar.Navn ORDER BY m.Navn;
I #3 er der adskillige problemer.
(1) Skoent "SELECT MAX(Datoen) FROM Point" finder den sidste dato finder "MAX(Datoen) -1" ikke den naestsidste dag. Du skal bruge et udtryk som dette: "SELECT SUBDATE((SELECT MAX(Datoen) FROM jimmydk_point), INTERVAL 1 DAY)".
(2) Det vil sikkert kunne forekomme at der er medlemmer der ikke har faaet points baade idag og igaar. For eksempel, der kommer vel nye medlemmer fra tid til anden og paa den foerste medlemsdag kan der ikke have vaeret points igaar. Dem vil du vel have med. Saa din join kan ikke vaere det gammeldags udtryk "FROM Point, Medlem WHERE ... Point.Navn = Medlem.Navn. Du maa bruge en LEFT JOIN.
(3) Hvis din sidste paragraf i #3 er det du vil have, altsaa Navn, Beskrivelse, Points_idag, Points_igaar, saa skal din SELECT string ikke indeholde Point.Datoen og behoever ikke baade Point.Navn og Medlem.Navn.
Jeg har for test lavet to tabeller: CREATE TABLE jimmydk_point(ID INT, Navn VARCHAR(10), Points INT, Datoen DATE); CREATE TABLE jimmydk_medlem(ID INT, Navn VARCHAR(10), Beskrivelse VARCHAR(10));
I de tabeller har jeg indfoert nogle testdata som jeg viser nedenstaaende. Jeg har med vilje gjort det saadan at ikke alle medlemmer har points de sidste to dage.
Ved at bruge ovenstaaende query paa disse testdata i disse tabeller faar jeg dette resultat:
producerer dette resultat:
Navn Beskrivelse Points_idag Points_igaar Palle Master 7 NULL Per Medlem 23 NULL Pernille Master 5 28 Peter Medlem NULL NULL Poul Master 9 2 Putte Medlem NULL 12
I mine testdata er det kun Pernille og Poul der har points baade idag og igaar. Palle og Per har points idag men ikke igaar. Putte har points igaar men ikke idag. Og Peter har hverken points idag eller igaar. Min query giver saaledes, som jeg har forstaaet, det resultat du er ude efter.
Jeg tillader mig at oprette dette indlaeg som et svar idet jeg mener at have besvaret dit spoergsmaal. Hvis der er problemer kan jeg foerst reagere paa tirsdag fordi jeg nu tager til udlandet (det er Danmark, jeg bor i Belgien) et par dage.
Her er mine testdata:
INSERT INTO jimmydk_medlem VALUES(1, 'Poul', 'Master'); INSERT INTO jimmydk_medlem VALUES(2, 'Per', 'Medlem'); INSERT INTO jimmydk_medlem VALUES(3, 'Palle', 'Mister'); INSERT INTO jimmydk_medlem VALUES(4, 'Pernille', 'Muffe'); INSERT INTO jimmydk_medlem VALUES(5, 'Peter', 'Mand'); INSERT INTO jimmydk_medlem VALUES(6, 'Putte', 'Matrone');
INSERT INTO jimmydk_point VALUES(1, 'Poul', 25, '2010-06-01'); INSERT INTO jimmydk_point VALUES(2, 'Poul', 2, '2010-06-9'); INSERT INTO jimmydk_point VALUES(3, 'Poul', 9, '2010-06-10'); INSERT INTO jimmydk_point VALUES(4, 'Poul', 16, '2010-06-5'); INSERT INTO jimmydk_point VALUES(5, 'Per', 23, '2010-06-10'); INSERT INTO jimmydk_point VALUES(6, 'Palle', 30, '2010-06-7'); INSERT INTO jimmydk_point VALUES(7, 'Palle', 7, '2010-06-10'); INSERT INTO jimmydk_point VALUES(8, 'Pernille', 14, '2010-06-7'); INSERT INTO jimmydk_point VALUES(9, 'Pernille', 21, '2010-06-8'); INSERT INTO jimmydk_point VALUES(10, 'Pernille', 28, '2010-06-9'); INSERT INTO jimmydk_point VALUES(11, 'Pernille', 5, '2010-06-10'); INSERT INTO jimmydk_point VALUES(12, 'Putte', 12, '2010-06-9'); INSERT INTO jimmydk_point VALUES(13, 'Putte', 19, '2010-06-8'); INSERT INTO jimmydk_point VALUES(14, 'Putte', 26, '2010-06-3'); INSERT INTO jimmydk_point VALUES(15, 'Putte', 3, '2010-06-1');
Jeg tager nu paa ferie et par dage, jeg er tilbage paa tirsdag hvis der er mere at goere paa dette spoergsmaal.
Jamen det var godt det virkede. Tak for points og for at lukke spoergsmaaket
Synes godt om
Ny brugerNybegynder
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.