Toon posts:

[mysql] Waarde uit veld, waar ander veld MAX is

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo,

Ik wil de waarde uit een veld, en.author, terug krijgen, waar en.uid max is. Ook moet er gelden dat en.report = er.uid

Wat ik had bedacht:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
SELECT
 er.uid,
 er.cursist,
 COUNT( en.uid ) AS aantalNotities,
 en2.author
FROM
 errorreports AS er
LEFT JOIN
 er_notes AS en ON en.report = er.uid
LEFT JOIN
 er_notes AS en2 ON en2.report = er.uid AND en2.uid = MAX( en2.uid )
LEFT JOIN
 er_categories AS cat ON cat.uid = er.category
WHERE
 er.assigned_to = ' . $_SESSION['user']['id'] . '
GROUP BY
 er.uid,
 er.cursist,
 en2.author


Hierbij krijg ik echter 'Invalid use of group function'.

Kunnen jullie mij de goede weg op sturen?

Alvast bedankt,
Roemer

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 17-05 11:04

Janoz

Moderator Devschuur®

!litemod

Een group function (MAX in dit geval) mag je zo in je where niet gebruiken. Hiervoor moet je 'HAVING' gebruiken.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
> [mysql]

3? 4.0? 4.1? 5?

  • TeasingU
  • Registratie: Juni 2001
  • Laatst online: 15-09-2022

TeasingU

I Live Longer

Ik denk dat je ipv Group By > Order By wil gebruiken.

cd /usr/ports/www/porn make install


  • Eelke Spaak
  • Registratie: Juni 2001
  • Laatst online: 12-05 15:26

Eelke Spaak

- Vlad -

TeasingU schreef op maandag 03 januari 2005 @ 17:12:
Ik denk dat je ipv Group By > Order By wil gebruiken.
Ik denk het niet, want als je een aggregate functie (i.e. COUNT()) gebruikt ben je verplicht te groupen op alle niet-aggregate velden.

TheStreme - Share anything with anyone


Verwijderd

Topicstarter
Janoz schreef op maandag 03 januari 2005 @ 16:10:
Een group function (MAX in dit geval) mag je zo in je where niet gebruiken. Hiervoor moet je 'HAVING' gebruiken.
Waar zou ik die HAVING dan moeten plaatsen? Want het lijkt alsof ik hem niet gewoon ipv AND kan zetten, en als ik hem na de GROUP clause zet, herkent mysql het veld en2.uid (die toch echt bestaat) niet?

edit:
mysql 4.0.22

[ Voor 8% gewijzigd door Verwijderd op 04-01-2005 12:13 ]


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 17-05 11:04

Janoz

Moderator Devschuur®

!litemod

Bedoel je nu dat je maar een beetje doelloos overal having loopt te plakken? Misschien is het handig om even de handleiding te lezen.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Verwijderd

Topicstarter
nee, niet doelloos, maar ik kom er niet uit.
In de manual geven ze namelijk alleen aan hoe je een voorwaarde aan de aggregate functions kan geven, niet aan een veld icm met een aggregate function, en dat is wat ik (volgens mij) nodig heb...

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 17-05 11:04

Janoz

Moderator Devschuur®

!litemod

All clauses used must be given in exactly the order shown in the syntax description. For example, a HAVING clause must come after any GROUP BY clause and before any ORDER BY clause.
# The HAVING clause can refer to any column or alias named in a select_expr. It is applied nearly last, just before items are sent to the client, with no optimization. (LIMIT is applied after HAVING.)
# Don't use HAVING for items that should be in the WHERE clause. For example, do not write this:

mysql> SELECT col_name FROM tbl_name HAVING col_name > 0;

Write this instead:

mysql> SELECT col_name FROM tbl_name WHERE col_name > 0;

# The HAVING clause can refer to aggregate functions, which the WHERE clause cannot:

mysql> SELECT user, MAX(salary) FROM users
-> GROUP BY user HAVING MAX(salary)>10;

However, that does not work in older MySQL servers (before version 3.22.5). Instead, you can use a column alias in the select list and refer to the alias in the HAVING clause:

mysql> SELECT user, MAX(salary) AS max_salary FROM users
-> GROUP BY user HAVING max_salary>10;
Enkele willekeurige quotes die ik tegen kwam door binnen die pagina op HAVING te zoeken. Daar staat bijvoorbeeld ook waarom hij en2.uid niet herkent (komt immers niet voor tussen SELECT en FROM).

Gewoon goed doorlezen.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Verwijderd

Topicstarter
Goed, ik ben nu tot het volgende gekomen:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
SELECT
 er.uid,
 er.cursist,
 COUNT( en.uid ) AS aantalNotes,
 en2.uid,
 en2.author
FROM
 errorreports AS er
  LEFT JOIN er_notes AS en ON en.report = er.uid
  LEFT JOIN er_notes AS en2 ON en2.report = er.uid
WHERE
(
 er.assigned_to = ' . $_SESSION['user']['id'] . '
 ' . ( $_SESSION['user']['rights']['view_complete_erlist'] ? 'OR er.assigned_to IS NOT NULL' : '' ) . '
)
AND
 er.glob_status = 1
AND
 en2.author != ' . $_SESSION['user']['id'] . '
GROUP BY
 er.uid,
 er.cursist
HAVING
 en2.uid = MAX( en2.uid )
ORDER BY
 er.uid
DESC
LIMIT 0, 10


Wat moet er dus geselecteerd worden? Alle ErrorReports, waarbij de en.author van het laatste ErrorNotitie die erbij hoort NIET gelijk is aan $_SESSION['user']['id'].
Ook moeten het aantal ErrorNotitie's bij elk report geselecteerd worden.

Ik krijg nu enkel het rapport terug, waarbij de author van laatste notitie _in het hele systeem_ niet gelijk is aan de $_SESSION['user']['id'].

Waar zit de fout? Ik heb namelijk niks in de manual kunnen vinden over het op deze manier combineren van having met max.

Alvast bedankt
Pagina: 1