Toon posts:

"if key exists (isset)" functie in MySQL?

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hoi :)

Bestaat er in mysql een soort van isset(record) functie?

Korte schets:
Ik heb een tabel "forums_access" met daarin een kolom: forum_blocked. De bedoeling is dat ik users kan blokkeren (dus forum_blocked = 1) tot sommige forums. Ik haal die informatie op via een LEFT JOIN, want het is natuurlijk zinloos om overal forum_blocked = 0 te gaan zetten voor users die "wel" toegang hebben. (er wordt dus alleen gezet als een user GEEN toegang heeft.. vandaar te left join)

Echer doe ik mijn php script nu "if ($row['forum_blocked'] != 1) toon forum stuff". Maar kan ik die IF test ook verplaatsen naar mijn query?

Want de verdeling tussen toegang <-> geen toegang is zo'n 95%/5%, dus het is een beetje zinloos om telkens opnieuw dat leeg veld door te sturen.

Is het zo duidelijk, of moet ik code posten? :) Ik krijg het moeilijk geformuleerd :)

thanks

  • supakeen
  • Registratie: December 2000
  • Laatst online: 09-09-2025
Kan aan mijn liggen maar (!isset($var)) is toch om te checken of een var leeg is :?

Verwijderd

Topicstarter
Op zaterdag 06 juli 2002 21:10 schreef zmn het volgende:
Kan aan mijn liggen maar (!isset($var)) is toch om te checken of een var leeg is :?
En wat heeft dat met de vraag te maken?

  • drGoeroe
  • Registratie: Januari 2002
  • Laatst online: 04-09-2021
SELECT veld
FROM table
WHERE veld != 1

of

WHERE veld IS NOT 1 (weet niet zeker of dit kan)

veld IS NOT NULL en IS NULL zijn er om te kijken of veld waarde heeft.

  • Postman
  • Registratie: Februari 2000
  • Laatst online: 15-08 20:11
Lama, CrAzY_R is me voor :)

Verwijderd

Topicstarter
Dat is het hem nu net :)

Om alle misverstanden te vermijden, ik heb weldegelijk
code:
1
2
3
4
WHERE forums_acess.forum_blocked = 1
WHERE forums_acess.forum_blocked != 1
WHERE forums_acess.forum_blocked != 0
WHERE forums_acess.forum_blocked = 0

Geprobeerd hoor :) maar bij deze queries geeft hij nooit resultaat.

EDIT: volgens mij heeft het iets te maken met de volgorde van de velden waarmee ik mijn query opbouw, want ik heb totaal geen benul hoe dat verschil kan uitmaken.. maar ik heb het nog al voorgehad :)

Ik zal de query zo meteen pasten anders..

Verwijderd

Topicstarter
Query waarmee het wel werkt, maar waarmee ik dus blocked forums niet kan eliminiren in de query zelf:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
    $db->query("    SELECT forum_topics.topic_id,topic_title,topic_status,topic_replies,user_name,topic_timestamp,forum_topics_visits.visit_timestamp,forums_access.forum_blocked
            FROM forum_topics,forums,users
            LEFT JOIN forum_topics_visits ON
                   forum_topics_visits.topic_id = forum_topics.topic_id
                && forum_topics_visits.user_id = '{$_SESSION['userID']}'
            LEFT JOIN forums_access ON                  /* forum access controleren */
                   forums_access.forum_id = '{$_GET['forumID']}'
                && forums_access.user_id = '{$_SESSION['userID']}'
            WHERE       forums.clan_id = '{$_SESSION['clanID']}'    /* clanID */
                && forum_topics.forum_id = '{$_GET['forumID']}' /* forumID */
                && forum_topics.forum_id = forums.forum_id  /* forums < - > topics */
                && users.user_id = forum_topics.user_id     /* topics < - > users */
           ");

Query waarmee ik het probeer (laatste lijntje is bij gekomen), maar er komt nooit een resultaat uit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    $db->query("    SELECT forum_topics.topic_id,topic_title,topic_status,topic_replies,user_name,topic_timestamp,forum_topics_visits.visit_timestamp,forums_access.forum_blocked
            FROM forum_topics,forums,users
            LEFT JOIN forum_topics_visits ON
                   forum_topics_visits.topic_id = forum_topics.topic_id
                && forum_topics_visits.user_id = '{$_SESSION['userID']}'
            LEFT JOIN forums_access ON                  /* forum access controleren */
                   forums_access.forum_id = '{$_GET['forumID']}'
                && forums_access.user_id = '{$_SESSION['userID']}'
            WHERE       forums.clan_id = '{$_SESSION['clanID']}'    /* clanID */
                && forum_topics.forum_id = '{$_GET['forumID']}' /* forumID */
                && forum_topics.forum_id = forums.forum_id  /* forums < - > topics */
                && users.user_id = forum_topics.user_id     /* topics < - > users */
                && forums_access.forum_blocked != 1
           ");

Verwijderd

Topicstarter
Omdat ik verwacht tot er toch niet meer op replied wordt (ja ik weet.. geen 24h), schop ik hem heven...

Mijn query is ..euhm... niet goed? Of maak ik mijn query te moeilijk? Of...?

  • Postman
  • Registratie: Februari 2000
  • Laatst online: 15-08 20:11
code:
1
&& forums_access.forum_blocked != 1

Die !=, maak daar eens <> van. Dat is namelijk de ISO standaard voor 'is not equal to', != wordt bij bepaalde SQL dialecten ondersteund (weet niet of MySQL dat doet).

Edit: MySQL vermeld de != wel in de documentatie, maar onder de <> (<> wordt ook gebruikt in het voorbeeld), dus misschien is <> de oplossing.
Je kunt anders ook >= 1 doen ofzo.

Verwijderd

Topicstarter
Yup, mysql herkent !=, <> werkt evengoed.

Ondertussen heb ik (natuurlijk) nog wat geprobeerd, en ik heb geconstateerd dat als ik WEL een rijtje aanmaak, maar forum_blocked bijvoorbeeld op 7 zet, dat hij de inhoud dan wel laat zien. Wis ik echter die rij (wat eigenlijk de bedoeling is, zie onder *D, dan laat hij niets zien.
Is er dan iets mis me de opbouw van mijn (tweede) LEFT JOIN.

* -> het is dus de bedoeling dat ik ALLEEN (!) ga aanduiden als een user GEEN toegang heeft tot een bepaald forum (ik zet forum_blocked dan dus op 1). Vandaar dat ik in mijn query 1) een LEFT JOIN gebruik en 2) een conditie leg op != 1

dus als
· ik in tabel 'forums_access' een rij met forum_blocked=1, laat hij de forum inhoud niet zien -> OK
· ik in tabel 'forums_access' een rij met forum_blocked=x met x != 1, laat hij de forum inhoud zien -> HALF OK.. zou moeten werken (wat het doet), maar is niet de bedoeling
· als ik in tabel 'forums_access' GEEN rij heb van het desbetreffende forum -> geen resultaten, NIET OK

Is het zo duidelijker? :7


--- EDIT ---
Je kunt anders ook >= 1 doen ofzo.
Je bedoelt zeker '< 1', want ofwel is een forum geblockt (1) ofwel niet (geen rij, dus ook geen 0). Maar wat is de inhoud van een lege variabele? > 1? < 1? niet te vergelijken? Is NULL > 1 of < 1? Geen 1 van de twee toch?

  • Postman
  • Registratie: Februari 2000
  • Laatst online: 15-08 20:11
Misschien ook controle op NOT NULL oid erbij zetten doormiddel van 'of' (ipv 'en' (&&))

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Wat doen die && trouwens in je query...

De sql standaard vereist daar het woord 'and'.
En ik denk dat je die AND van je forums_access naar je join moet verhuizen, zodat je iets als:
code:
1
2
3
4
LEFT JOIN forums_access ON  /* forum access controleren */
        forums_access.forum_id = '{$_GET['forumID']}'
        && forums_access.user_id = '{$_SESSION['userID']}'
&& forums_access.forum_blocked != 1

krijgt.

Verwijderd

Topicstarter
Op zondag 07 juli 2002 20:14 schreef FlamerX het volgende:
Misschien ook controle op NOT NULL oid erbij zetten doormiddel van 'of' (ipv 'en' (&&))
Allemaal geprobeerd :'( :
code:
1
2
...
&& ( forums_access.forum_blocked != 1 || forums_access.forum_blocked = NULL )

+ andere combinaties (voor het geval van), maar NIETS wil.

Ik krijg meer en meer het idee dat de fout ergens anders ligt, maar ik vind niet waar, grmbl :?

Verwijderd

Topicstarter
Op zondag 07 juli 2002 20:18 schreef ACM het volgende:
Wat doen die && trouwens in je query...

De sql standaard vereist daar het woord 'and'.
Ja, ik weet :) Maar heb er nooit last mee gehad, maar je hebt gelijk... ga het gelijk veranderen. thanks
En ik denk dat je die AND van je forums_access naar je join moet verhuizen, zodat je iets als:
code:
1
2
3
4
LEFT JOIN forums_access ON  /* forum access controleren */
        forums_access.forum_id = '{$_GET['forumID']}'
        && forums_access.user_id = '{$_SESSION['userID']}'
&& forums_access.forum_blocked != 1

krijgt.
IDD! nu lijkt het te werken! Maar nu snap ik wel totaal niet waarom. Ik zie het verschil niet echt in?
Als je zo vriendelijk wilt zijn... :*

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Op zondag 07 juli 2002 20:24 schreef DiEana het volgende:
IDD! nu lijkt het te werken! Maar nu snap ik wel totaal niet waarom. Ik zie het verschil niet echt in?
Als je zo vriendelijk wilt zijn... :*
Nu join je op een voorwaardelijke forums_access, namelijk alleen diegenen die forum_blocked != 1 zijn ;)
Anders probeer je te joinen op forums_access (die, dat is inherent aan de left join, niet perse bestaat) en probeert dan te testen of ze forum_blocked != 1 zijn.
Dat laatste zal dus niet helemaal lekker kunnen werken.

Verwijderd

Topicstarter
Op zondag 07 juli 2002 20:27 schreef ACM het volgende:

[..]

Nu join je op een voorwaardelijke forums_access, namelijk alleen diegenen die forum_blocked != 1 zijn ;)
Anders probeer je te joinen op forums_access (die, dat is inherent aan de left join, niet perse bestaat) en probeert dan te testen of ze forum_blocked != 1 zijn.
Dat laatste zal dus niet helemaal lekker kunnen werken.
Ach... moet ik daarvoor een topic openen? :?
Beetje logisch ja ;)

Thanks ACM en de rest!

Verder is de query in orde? Want ik zit soms (vaak) in de knoei in de volgorde waarmee ik mijn WHERE-gedeelte opbouw qua efficiëntie enzo :+
Pagina: 1