Ik heb 2 tabellen, 1 met users en de ander waarin de user_id wordt gebruikt.
Nou wil ik eerst weten of een ID in tabel 1 voorkomt, zo ja of ie ook in tabel 2 voorkomt.
Ik dacht dat ik het had, maar het werkt toch niet helemaal naar behoren.
Iemand die mij op weg kan helpen?
Bvd
<?php
$sql = "
SELECT
COUNT(u.id) AS num_uid
,COUNT(v.user_id) AS num_vuser_id
FROM
" . TABLE_PREFIX . "users AS u
INNER JOIN
" . TABLE_PREFIX . "viewers AS v
WHERE
(
(
u.id = :user_id
AND v.user_id = :user_id
)
OR
u.id = :user_id
)
";
?>
Ah, volgens mij heb ik het antwoord hier gevonden.
Alleen snap ik niet helemaal wat het nou doet. 1 = true, 0 = false neem ik aan.
Bij false is num_uid dan 0, en bij true het aantal rijen of alleen 1?
Als het aantal niet belangrijk is, maar alleen of het bestaat, is SUM() dan onnodig?
[code]
$sql = "
SELECT
SUM(if(u.id = :user_id AND u.active = 1, 1, 0)) AS num_uid
,SUM(if(v.user_id = :user_id, 1, 0)) AS num_vuser_id
FROM
" . TABLE_PREFIX . "users AS u
INNER JOIN
" . TABLE_PREFIX . "viewers AS v
Super bedankt Ger! Dat is een heel stuk mooier dan de rare if/else constructie die ik vond.
Bij deze opgelost :)
<?php
$sql = "
SELECT
COUNT(u.id) AS num_uid
,COUNT(v.user_id) AS num_vuser_id
FROM
" . TABLE_PREFIX . "users AS u
LEFT JOIN
" . TABLE_PREFIX . "viewers AS v
ON u.id = v.user_id
WHERE
u.id = :user_id
AND u.active = 1
GROUP BY
v.user_id
";
?>
Alleen is het niet helemaal correct, je doet de group_by op een anonymous kolom, die ook nog eens NULL kan zijn.
Ik neem aan users.id uniek is in tabel, dus waarom zou je die tellen.
Wel een group by, je hebt 3 mogelijkdeden:
1) De query geeft geen rijen terug (i.e de user bestaat niet of is niet actief)
2) De query geeft een rij terug met num_views = 0
3) De query geeft een rij terug met num_views > 0
Maar ik moet zowel weten over de user id bestaat en of die user bestaat in views. Zoals ik het nu heb is dus fout, maar werkt wel zoals ik bedoel. Wat doe ik dan toch fout?
Het werkt omdat het MySQL is, en omdat het één user betreft.
In PostGres zou je een foutmelding krijgen op de group by.
De query die ik zou gebruiken is zowel geschikt voor één user, als voor meerdere users.
Als het voor één user is kan je de group by ook weglaten.
Hoe zou je dat dan doen? Dan krijg je dus alsnog een AND OR zoals in m'n eerste post. If($num_views > 0) GROUP BY user_id of zoiets. Is de COUNT verder wel goed dan? Omdat je daar ook over viel, maar ik wil toch weten of ie er is of niet. In mysql(i) zou ik dan ook $result->num_rows > 0 doen, dus dacht hier ook aan COUNT.
Ik viel niet zozeer over de COUNT(u.id) op zich, maar in combinatie met de group_by heeft ie niet zo veel zin.
Zonder de group by wel, want dan kan je alleen aggegrates in de select hebben, je krijgt dan dus:
SELECT
COUNT(DISTINCT u.id) num_uid,
COUNT(v.user_id) as num_views
FROM
users AS u
LEFT JOIN
viewers as v
ON u.id = v.user_id
WHERE
u.id = 666