Avatar billede Mik2000 Professor
25. september 2016 - 19:54 Der er 9 kommentarer og
2 løsninger

Hent fra kunde og ordretabel

Hej

Jeg har SQL sætning jeg ikke helt kan greje

Jeg har tabellerne (lidt simplificeret her)
kunder (kId, kNavn, kEmail ...)
ordrer (oId, oKundeId, oDate ...)
ordrerLinjer (olId, olOrderId, oType)

Hver kunde kan have flere ordrer
Hver ordrer kan have flere ordrerlinjer

Nu skal jeg
1: Hente alle kunder (kNavn, kEmail) som har købt noget med oType == 3
2: Hente alle kunder (kNavn, kEmail) som IKKE har købt noget oType == 3
Avatar billede olsensweb.dk Ekspert
25. september 2016 - 20:58 #1
ikke som så et PHP spm
burde have ligget
http://www.computerworld.dk/eksperten/spm/databaser/mysql


lidt hurtigt
>1: Hente alle kunder (kNavn, kEmail) som har købt noget med oType == 3

SELECT kNavn, kEmail FROM kunder JOIN ordrer ON kid=oKundeId JOIN ordrerlinjer ON oid=olOrderId WHERE oType=3


>2: Hente alle kunder (kNavn, kEmail) som IKKE har købt noget oType == 3

SELECT kNavn, kEmail FROM kunder JOIN ordrer ON kid=oKundeId JOIN ordrerlinjer ON oid=olOrderId WHERE oType !=3


elleres må du komme med nogle test tabeller med test data, og svar på hvad du forvendter
Avatar billede arne_v Ekspert
25. september 2016 - 21:10 #2
SELECT kNavn, kEmail FROM kunder WHERE kId IN (SELECT oKundeId FROM ordrer JOIN ordrerlinier ON ordrer.oId=ordrerLinjer.olOrderId WHERE oType = 3)

og:

SELECT kNavn, kEmail FROM kunder WHERE kId NOT IN (SELECT oKundeId FROM ordrer JOIN ordrerlinier ON ordrer.oId=ordrerLinjer.olOrderId WHERE oType = 3)
Avatar billede arne_v Ekspert
25. september 2016 - 21:14 #3
Den foerste skulle gerne give samme resultat som ronols's.

Den anden giver et andet resultat end ronols's.

Der er forskel paa at finde:
- kunder som har ordrerlinier der ikke er 3
- kunder som ikke har ordrerlinier med 3
Avatar billede Mik2000 Professor
26. september 2016 - 00:02 #4
Hej

Tak for svarene. Oh ja sorry omkring kategorien

Hvis du eksempelvis det kan være 2 typer og en ordre skal være betalt (oBetalt = 1) og ikke slettet (oSlettet = 0) for at kunden skal med på listen, kan man så gøre sådan

Når jeg forsøger det synes jeg nemlig umiddelbart at jeg får alle med - også dem der ikke er betalt f.eks.

SELECT kNavn, kEmail FROM kunder WHERE kId IN (SELECT oKundeId FROM ordrer JOIN ordrerlinier ON ordrer.oId=ordrerLinjer.olOrderId WHERE (oType = 3 OR oType = 4) AND oBetalt = 1 AND oSlettet = '0')

og:

SELECT kNavn, kEmail FROM kunder WHERE kId NOT IN (SELECT oKundeId FROM ordrer JOIN ordrerlinier ON ordrer.oId=ordrerLinjer.olOrderId WHERE (oType = 3 OR oType = 4) AND oBetalt = 1 AND oSlettet = '0')
Avatar billede arne_v Ekspert
26. september 2016 - 01:50 #5
Umiddelbart ser de OK ud.
Avatar billede olsensweb.dk Ekspert
26. september 2016 - 10:07 #6
hvilke fejl får du ??
er du opmærksom på ordrerlinier og ordrerLinjer ikke opfattes som sammen tabel


WHERE (oType = 3 OR oType = 4)
ville jeg nok bruge en IN så det se sådan ud
WHERE oType IN (3,4)


SELECT kNavn, kEmail FROM kunder
    WHERE kId NOT IN (
        SELECT oKundeId FROM ordrer JOIN ordrerlinjer ON ordrer.oId=ordrerlinjer.olOrderId
            WHERE oType IN (3,4)
            AND oBetalt = 1 AND oSlettet = '0'
)


når du anvender flere tabeller, kan det være en fordel at angive tabel navnet foran kollone navnet, da det efter signe skulle give noget performance, da sql'en hurtigere kan finde kollonen
andre gange er det et krav, hvis du har sammen kollone navn i flere tabeller
Avatar billede Mik2000 Professor
03. oktober 2016 - 14:39 #7
Hej
Har prøvet og prøvet nu.

Der kommer ingen fejl, men det er som om den ignorerer at feltet oBetalt skal være 1 og bare tager alle
Avatar billede Mik2000 Professor
03. oktober 2016 - 14:55 #8
Tror jeg fandt fejlen

SELECT kNavn, kEmail FROM kunder WHERE kId NOT IN (SELECT oKundeId FROM ordrer JOIN ordrerlinier ON ordrer.oId=ordrerLinjer.olOrderId WHERE (oType = 3 OR oType = 4) AND oBetalt = 1 AND oSlettet = '0')

Den sidste del skulle være

WHERE oType IN (3, 4) OR oBetalt = 0 OR oSlettet = 1)
da det jo var NOT IN
Avatar billede Mik2000 Professor
20. oktober 2016 - 23:19 #9
Hov fik aldrig lukket denne - sorry. Hvordan deler jeg point mellem jer her i det "nye"?
Avatar billede arne_v Ekspert
21. oktober 2016 - 01:38 #10
Du burde kunne markere alle de kommentarer som du betragter som svar.
Avatar billede Mik2000 Professor
21. oktober 2016 - 13:34 #11
Sådan (vidste ikke man kunne markere flere) - tak for hjælpen :)
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

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