Hallo,

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
	)
";
?>



<?php
if($row['num_uid'] > 0)
{
	if($row['num_vuser_id'] > 0)
	{

	}
}
?>


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?

[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

";
[/code[
Een inner join zonder voorwaarden is een crossjoin.
Maar waarom geen left join:

SELECT u.id,
	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
GROUP BY user_id


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.
Ger, geen group by dan?
Id uit users is uniek, maar ik moet toch weten of het aantal 1 of 0 is...
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 
Bedankt, maar waarom een DISTINCT op een uniek veld?

"The DISTINCT keyword can be used to return only distinct (different) values."

Reageren