[SQL] aantal eerste rij en aantal tweede rij anders alleen eerste rij
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
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?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
)
";
?>
$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
)
";
?>
Toevoeging op 03/04/2014 15:50:18:
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?
Maar waarom geen left join:
Bij deze opgelost :)
Ik neem aan users.id uniek is in tabel, dus waarom zou je die tellen.
Id uit users is uniek, maar ik moet toch weten of het aantal 1 of 0 is...
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?
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.
Zonder de group by wel, want dan kan je alleen aggegrates in de select hebben, je krijgt dan dus:
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
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
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
Gewijzigd op 04/04/2014 11:42:23 door Ger van Steenderen
"The DISTINCT keyword can be used to return only distinct (different) values."
Omdat u.id in het resultaat niet unique hoeft te zijn, maak de query maar eens zonder de counts.
Ziet er goed uit. Nogmaals bedankt.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
user_id in users
num_uid 1 num_vuser_id 0
user_id in viewers of in geen van beide
num_uid 0 num_vuser_id 0
user_id in users en viewers
num_uid 1 num_vuser_id 1
user_id in users en twee keer in viewers
zonder distinct
num_uid 2 num_vuser_id 2
met distinct
num_uid 1 num_vuser_id 2
num_uid 1 num_vuser_id 0
user_id in viewers of in geen van beide
num_uid 0 num_vuser_id 0
user_id in users en viewers
num_uid 1 num_vuser_id 1
user_id in users en twee keer in viewers
zonder distinct
num_uid 2 num_vuser_id 2
met distinct
num_uid 1 num_vuser_id 2