Sorteren en combineren van 2 kolommen

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Leon Kunst

Leon Kunst

11/02/2009 10:38:00
Quote Anchor link
Heren,


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...
 
PHP hulp

PHP hulp

22/12/2024 05:15:49
 
Cees St

Cees St

11/02/2009 10:51:00
Quote Anchor link
dat kan je het beste met een JOIN doen.

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
 
Leon Kunst

Leon Kunst

11/02/2009 11:57:00
Quote Anchor link
Hmm...

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)
PHP script in nieuw venster Selecteer het PHP script
1
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
?>
 
Timen kut

Timen kut

11/02/2009 11:59:00
Quote Anchor link
Als je vrijwel identieke tabellen hebt kun je ook UNION gebruiken...
 
Leon Kunst

Leon Kunst

11/02/2009 12:34:00
Quote Anchor link
Ik kom er maar niet uit...

dit is nu mijn query... en nog steeds werkt ie niet...

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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


.... wat is er mis mee?
 
Timen kut

Timen kut

11/02/2009 12:38:00
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
SELECT * FROM ((SELECT * FROM mediatheek) UNION (SELECT * FROM galerij)) as t ORDER BY t.file DESC


Zo gebruik ik m op t moment
 
Leon Kunst

Leon Kunst

11/02/2009 14:41:00
Quote Anchor link
Hmm ik krijg het niet goed verwerkt in mijn query,
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....
 
Cees St

Cees St

11/02/2009 14:55:00
Quote Anchor link
Hoi was even bij een klant, maar wat doet die nu wel en wat niet.

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!
 
Leon Kunst

Leon Kunst

11/02/2009 15:03:00
Quote Anchor link
De tabelnaam had ik ook verkeerd ingevuld.

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)
PHP script in nieuw venster Selecteer het PHP script
1
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

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...
 
Joren de Wit

Joren de Wit

11/02/2009 15:31:00
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
SELECT
  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
 
Leon Kunst

Leon Kunst

11/02/2009 16:02:00
Quote Anchor link
Ik wordt echt knettergek...
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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


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.
 
Joren de Wit

Joren de Wit

11/02/2009 16:05:00
Quote Anchor link
En welke foutmelding krijg je nu?

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...
 
Leon Kunst

Leon Kunst

11/02/2009 16:20:00
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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


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
 
Joren de Wit

Joren de Wit

11/02/2009 16:35:00
Quote Anchor link
Zie de edit van de query in mijn vorige post, er ontbrak daar nog het woordje THEN ;-)
 
Cees St

Cees St

11/02/2009 16:38:00
Quote Anchor link
Ik zou het wat simpeler proberen.
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
 
Leon Kunst

Leon Kunst

11/02/2009 16:47:00
Quote Anchor link
Yes!

Heren, ik dank jullie!

Na een hoop geklooi etc was het inderdaad opgelost nadat ik THEN had toegevoegd :)

Hij werkt super!
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.