Sorteren en combineren van 2 kolommen
Ik heb een database, met OA 2 velden: project_pmv, en klant_pmv.
Ik trek nog meer gegevens uit de database met een query, maar ik wil graag bovenstaande velden combineren in een ORDER BY.
Hiermee bedoel ik, als project_pmv niet gelijk is aan 0, gebruik dan project_pmv, en anders klant_pmv.
Maar de output moet dus wel in 1 lijst op alfabet gezet worden.
Stel de data is:
A project_pmv
D project_pmv
G project_pmv
F project_pmv
F klant_pmv
E klant_pmv
H klant_pmv
Dan moet het er zo uit komen:
A
D
E
F
F
G
H
Een simpele: ORDER BY project_pmv ASC, klant_pmv ASC werkt helaas niet zoals ik het wil...
Op Google kan je daar veel voorbeelden van vinden.
The INNER JOIN keyword return rows when there is at least one match in both tables.
SQL INNER JOIN Syntax
SELECT column_name(s)
FROM table_name1
INNER JOIN table_name2
ON table_name1.column_name=table_name2.column_name
Ik ben er mee aan't stoeien, maar hij geeft een syntax error. Ik zal er wel overheen kijken denk ik...
Dit is nu mijn query:
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
<?
mysqlquery("
SELECT *, (opleverdatum < NOW()) as overtijd, project.id as id, project.PMV as project_pmv, klant.PMV as klant_pmv
FROM project, klant
WHERE klant_id = klant.id
AND (status_id = 1 OR status_id = 2)
AND classificatie = 0
INNER JOIN project ON project.klant_pmv = project.project_pmv
?>
mysqlquery("
SELECT *, (opleverdatum < NOW()) as overtijd, project.id as id, project.PMV as project_pmv, klant.PMV as klant_pmv
FROM project, klant
WHERE klant_id = klant.id
AND (status_id = 1 OR status_id = 2)
AND classificatie = 0
INNER JOIN project ON project.klant_pmv = project.project_pmv
?>
Als je vrijwel identieke tabellen hebt kun je ook UNION gebruiken...
dit is nu mijn query... en nog steeds werkt ie niet...
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
SELECT * , (
opleverdatum <
NOW( )
) AS overtijd, project.id AS id, (
SELECT project.PMV AS project_pmv
FROM project
)
UNION (
SELECT klant.PMV AS klant_pmv
FROM klant
)
FROM project, klant
WHERE klant_id = klant.id
AND (
status_id =2
OR status_id =1
)
AND classificatie =0
AND voortgangspercentage <
100 ORDER BY project_pmv ASC , klant_pmv ASC LIMIT 0 , 30
opleverdatum <
NOW( )
) AS overtijd, project.id AS id, (
SELECT project.PMV AS project_pmv
FROM project
)
UNION (
SELECT klant.PMV AS klant_pmv
FROM klant
)
FROM project, klant
WHERE klant_id = klant.id
AND (
status_id =2
OR status_id =1
)
AND classificatie =0
AND voortgangspercentage <
100 ORDER BY project_pmv ASC , klant_pmv ASC LIMIT 0 , 30
.... wat is er mis mee?
Code (php)
1
SELECT * FROM ((SELECT * FROM mediatheek) UNION (SELECT * FROM galerij)) as t ORDER BY t.file DESC
Zo gebruik ik m op t moment
als ik de rest erom weg sloop werkt het wel goed geloof ik...
Maar er zitten dus voorwaarden aan, dat als project_pmv als resultaat '0' geeft, dat ie dan de waarde van klant_pmv moet gebruiken....
Een Union zou ik niet gebruiken, want die is echt voor andere zaken
SELECT *, (opleverdatum < NOW()) as overtijd, project.id as id, project.PMV as project_pmv, klant.PMV as klant_pmv
FROM project, klant
INNER JOIN project ON project.klant_pmv = project.project_pmv
WHERE klant_id = klant.id
De JOIN is niet goed, de JOIN zou in dit geval van Project=>Klant gaan
dus moet er in de ON ook een klant veld voorkomen!
Ik heb 2 tabellen waar alle informatie uitgehaald moet worden:
Klant, Project.
Beide tabellen bevatten: pmv als kolomnaam (en nog wel meer kolommen).
Code (php)
1
2
3
4
2
3
4
SELECT *, (opleverdatum < NOW()) as overtijd, project.id as id, project.PMV as project_pmv, klant.PMV as klant_pmv
FROM project, klant WHERE klant_id = klant.id
AND (status_id=2 OR status_id = 1)
AND classificatie=0
FROM project, klant WHERE klant_id = klant.id
AND (status_id=2 OR status_id = 1)
AND classificatie=0
Dit is de oude code
nu wil ik alleen nog, dat er op die klant.pmv en project.pmv een check op komt, zoals ik hierboven uitlegde.
Dat als project.pmv 0 teruggeeft, dat hij niet die terugstuurt, maar de waarde van klant_pmv...
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
SELECT
CASE WHEN project.pmv <> 0 THEN
project.pmv
ELSE
klant.pmv
END AS pmv
FROM
...
CASE WHEN project.pmv <> 0 THEN
project.pmv
ELSE
klant.pmv
END AS pmv
FROM
...
Dit is een manier waarop je de juiste pmv zou kunnen selecteren. De rest van de kolommen die je wilt selecteren, zul je zelf nog even aan de SELECT moeten toevoegen. En vervang dan gelijkt de * door de kolommen die je wilt selecteren, dat is duidelijker en zorgt voor minder problemen als je je query nog eens moet debuggen.
edit: THEN toegevoegd aan query
Gewijzigd op 01/01/1970 01:00:00 door Joren de Wit
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
SELECT *, (opleverdatum < NOW()) as overtijd, project.id as id,
CASE WHEN project.pmv <> 0
project.pmv
ELSE
klant.pmv
END AS pmv
FROM project, klant WHERE klant_id = klant.id
AND (status_id=2 OR status_id = 1)
AND classificatie=0
CASE WHEN project.pmv <> 0
project.pmv
ELSE
klant.pmv
END AS pmv
FROM project, klant WHERE klant_id = klant.id
AND (status_id=2 OR status_id = 1)
AND classificatie=0
En hij blijft maar syntaxfouten geven.
Dat sterretje zit daar, omdat er best veel verschillende kolommen uitgelezen moeten worden. Zo is het nog iets overzichtelijker om hier te plaatsen.
Verder zou ik dat * toch vervangen door alle kolomnamen die je selecteert en ook consequent de tabelnaam (-alias) opgeven bij de kolomnamen aangezien je uit meerdere tabellen selecteert. Op die manier houd je het voor jezelf overzichtelijk en wordt het debuggen van je queries stukken eenvoudiger...
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SELECT
project.klant_id,
project.offertecode,
project.omschrijving,
project.voortgangspercentage,
project.notitie,
(opleverdatum < NOW()) as overtijd,
project.id as id,
CASE
WHEN project.pmv <> 0 project.pmv
ELSE klant.pmv
END AS pmv
FROM project, klant
WHERE klant_id = klant.id
AND (status_id=2 OR status_id = 1)
AND classificatie=0
project.klant_id,
project.offertecode,
project.omschrijving,
project.voortgangspercentage,
project.notitie,
(opleverdatum < NOW()) as overtijd,
project.id as id,
CASE
WHEN project.pmv <> 0 project.pmv
ELSE klant.pmv
END AS pmv
FROM project, klant
WHERE klant_id = klant.id
AND (status_id=2 OR status_id = 1)
AND classificatie=0
geeft:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'project.pmv ELSE klant.pmv END AS pmv FROM project, klant WHERE
Pff.. kwordt er gek van:P
Zie de edit van de query in mijn vorige post, er ontbrak daar nog het woordje THEN ;-)
De fout die je krijgt, is meestal tengevolge van een verkeerde veldnaam.
SELECT *, (opleverdatum < NOW()) as overtijd, project.id as id, project.PMV as project_pmv, klant.PMV as klant_pmv
FROM project, klant
INNER JOIN klant ON klant.id = project.klant_id
WHERE klant_id = klant.id
AND (status_id=2 OR status_id = 1)
AND classificatie=0
Nu is Project.pmv of klant.pmv gevuld met een waarde
de ORDER kan dan bijvoorbeeld zijn
ORDER BY project.pmv, klant.pmv
Heren, ik dank jullie!
Na een hoop geklooi etc was het inderdaad opgelost nadat ik THEN had toegevoegd :)
Hij werkt super!