[SQL] aantal eerste rij en aantal tweede rij anders alleen eerste rij

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Michael -

Michael -

03/04/2014 15:33:59
Quote Anchor link
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

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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
    )
"
;
?>


Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?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 (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
$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[
 
PHP hulp

PHP hulp

17/11/2024 05:21:33
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

03/04/2014 15:54:43
Quote Anchor link
Een inner join zonder voorwaarden is een crossjoin.
Maar waarom geen left join:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
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
 
Michael -

Michael -

03/04/2014 16:12:22
Quote Anchor link
Super bedankt Ger! Dat is een heel stuk mooier dan de rare if/else constructie die ik vond.
Bij deze opgelost :)
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?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
"
;
?>
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

03/04/2014 17:01:26
Quote Anchor link
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.
 
Michael -

Michael -

03/04/2014 19:37:10
Quote Anchor link
Ger, geen group by dan?
Id uit users is uniek, maar ik moet toch weten of het aantal 1 of 0 is...
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

03/04/2014 19:50:44
Quote Anchor link
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
 
Michael -

Michael -

03/04/2014 21:05:32
Quote Anchor link
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?
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

04/04/2014 08:04:13
Quote Anchor link
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.
 
Michael -

Michael -

04/04/2014 08:11:44
Quote Anchor link
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.
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

04/04/2014 11:41:58
Quote Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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
Gewijzigd op 04/04/2014 11:42:23 door Ger van Steenderen
 
Michael -

Michael -

04/04/2014 11:44:54
Quote Anchor link
Bedankt, maar waarom een DISTINCT op een uniek veld?

"The DISTINCT keyword can be used to return only distinct (different) values."
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

04/04/2014 11:51:31
Quote Anchor link
Omdat u.id in het resultaat niet unique hoeft te zijn, maak de query maar eens zonder de counts.
 
Michael -

Michael -

04/04/2014 12:00:20
Quote Anchor link
Nee ik zie het. Was het even aan het uittesten.
Ziet er goed uit. Nogmaals bedankt.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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


Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
$sql
= "
SELECT
    COUNT(DISTINCT 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
"
;
?>
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.