[PHP/MySQL] COUNT (alias) in WHERE

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Wees gegroet!

Goed, ik heb 2 tabellen, namelijk cj_jobs en cj_failure.
Nu wil ik uit de tabel cj_jobs alle rijen halen, waarbij maximaal 1x het id van die rij voorkomt in de tabel cj_failure

wat ik tot nu toe heb:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$query = '
    SELECT
     j.j_id,
     j.j_hours,
     j.j_minutes,
     j.j_url,
     COUNT(f.f_id) AS f_aantal
    FROM
     ' . $cfg['db']['prefix'] . 'jobs AS j,
     ' . $cfg['db']['prefix'] . 'failure AS f
    WHERE
     f.f_j_id = j.j_id AND
     f_aantal <= 2   
    ';


ik krijg terug:
Unknown column 'f_aantal' in 'where clause'

Heeft iemand hier de oplossing voor?

Acties:
  • 0 Henk 'm!

  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

kijk eens naar group by en having

Who is John Galt?


Acties:
  • 0 Henk 'm!

  • Speedener
  • Registratie: September 2000
  • Laatst online: 18-09 12:54
die column f_aantal, in welke tabel zit die? dat moet je nog ff aangeven

LG Therma V Split WP: HU143MA.U33-HN1636M NK5


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
die f_aantal is een alias voor COUNT(f.f_id)

voglende query werkt ook niet:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT
     j.j_id,
     j.j_hours,
     j.j_minutes,
     j.j_url,
     COUNT(f.f_id) AS f_aantal
    FROM
     ' . $cfg['db']['prefix'] . 'jobs AS j,
     ' . $cfg['db']['prefix'] . 'failure AS f
    WHERE
     f.f_j_id = j.j_id
    GROUP BY f.f_id
    HAVING (f_aantal <= 2 )

Acties:
  • 0 Henk 'm!

  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Verwijderd schreef op 29 februari 2004 @ 21:45:
die f_aantal is een alias voor COUNT(f.f_id)

voglende query werkt ook niet:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SELECT
     j.j_id,
     j.j_hours,
     j.j_minutes,
     j.j_url,
     COUNT(f.f_id) AS f_aantal
    FROM
     ' . $cfg['db']['prefix'] . 'jobs AS j,
     ' . $cfg['db']['prefix'] . 'failure AS f
    WHERE
     f.f_j_id = j.j_id
    GROUP BY j.j_id,
     j.j_hours,
     j.j_minutes,
     j.j_url
    HAVING COUNT(f.f_id) <= 2
Probeer dit eens.

[ Voor 18% gewijzigd door justmental op 29-02-2004 22:12 ]

Who is John Galt?


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

:?

Moet je niet gewoon groupen op j.j_id (niet op f.f_id, aangezien dat nou net degene is die je wilt tellen)?

Groeperen op al die velden lijkt me sowieso al onjuist

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 20:01
Een 'echt RDBMS' vereist dat je grouped op alle velden die in je SELECT list staan, en geen aggregated functie zijn.
Echter, dat id zal ws altijd uniek zijn, waardoor je niet echt de gewenste resultaten zult krijgen. Ik vraag me dus af of het nodig is om ook dat ID erbij te hebben? Welk ID wil je nl zien, als je groupeert op die andere velden ?

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Okey, ik ben nog niet echt veel wijzer geworden, want alle bovenstaande voorbeelden werkte niet...
Ook heb ik ondertussen dankzij een denk-fout een andere query, een update query.

PHP:
1
2
3
4
5
6
UPDATE
 cj_jobs
SET
 j_status = 0
WHERE
COUNT(f.f_j_id = j.j_id) >= 2


Komt op hetzelfde neer dus, maar dan nog vager, omdat ik een andere tabel moet gebruiken bij deze update (failure f).

Is dit mogelijk wat ik wil? En op welke manier(en) dan?

Acties:
  • 0 Henk 'm!

  • andrew
  • Registratie: Februari 2001
  • Laatst online: 10-09-2024
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?
SELECT 
     j.j_id, 
     j.j_hours, 
     j.j_minutes, 
     j.j_url, 
     COUNT(f.f_id) AS f_aantal 
    FROM 
     ' . $cfg['db']['prefix'] . 'jobs AS j, 
     ' . $cfg['db']['prefix'] . 'failure AS f 
    WHERE 
     f.f_j_id = j.j_id 
    GROUP BY f.f_j_id
    HAVING COUNT(f.f_id) <= 2
?> 
Volgens mij zou het zo moeten werken..


Dat andere probleem van je is me niet helemaal duidelijk, maar dat moet je waarschijnlijk ook gewoon met een group by oplossen omdat je COUNT wil gebruiken in een WHERE en dat kan nooit..

[ Voor 9% gewijzigd door andrew op 01-03-2004 20:42 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
De query van Andrew zat erg dicht in de buurt, maar hij liet juist alle zien die er WEL 2x in stonden, en als de failure tabel leeg was gebeurde er dus niks.

Toen kreeg ik een ping, en dacht ik opeens aan left join. Met dat idee heb ik het volgende gebakken, en het werkt:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SELECT 
     j.j_id, 
     j.j_hours, 
     j.j_minutes, 
     j.j_url
    FROM
     ' . $cfg['db']['prefix'] . 'jobs AS j
    LEFT JOIN
     ' . $cfg['db']['prefix'] . 'failure AS f
    ON
     f.f_j_id = j.j_id
    GROUP BY
     j.j_id, 
     j.j_hours, 
     j.j_minutes, 
     j.j_url
    HAVING COUNT(f.f_id) <= 1


Misschien kan het nog netter, suggesties zijn altijd welkom!

Maar nu die update query, nog wat toelichting:

Ik wil een veld j_status (in jobs) op 0 zetten, wanneer j_id 2 of meer voorkomt in de tabel failure, in het veld f_j_id

Ik heb zelf eignelijk een beetje het gevoel dat dit niet kan met 1 query, maar ik ben ook niet zo'n sql-pro....
Pagina: 1