Avatar billede jimmydk Nybegynder
10. juni 2010 - 09:30 Der 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å.

Men det kommer ud som navn1 alle sammen.

Nogen der har en løsning på dette.?
10. juni 2010 - 10:22 #1
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.
Avatar billede janus_007 Nybegynder
10. juni 2010 - 12:23 #2
Lav en union

select navn1, null as navn2 from table.navn where colval <= 2
union
select null, navn2 from table.navn where colval > 2
Avatar billede jimmydk Nybegynder
10. juni 2010 - 20:03 #3
Min sql er 

Tabel Point
ID
Navn
Points
Datoen

Tabel Medlem
ID
Navn
Beskrivelse

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
11. juni 2010 - 00:00 #4
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.
14. juni 2010 - 20:10 #5
jimmydk, jeg er med igen.  Fik du mit indlaeg?  Hvad er din reaktion?  Var det til nytte?  Hvis ikke, hvor fejlede det?
Avatar billede jimmydk Nybegynder
14. juni 2010 - 20:56 #6
Hej

Det virkede uden problemer, men ville lige vente til du var online igen. ;o)

SÅ der er lidt points på vej.!
14. juni 2010 - 21:38 #7
Jamen det var godt det virkede.  Tak for points og for at lukke spoergsmaaket
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester