Op deze website gebruiken we cookies om content en advertenties te personaliseren, om functies voor social media te bieden en om ons websiteverkeer te analyseren. Ook delen we informatie over uw gebruik van onze site met onze partners voor social media, adverteren en analyse. Deze partners kunnen deze gegevens combineren met andere informatie die u aan ze heeft verstrekt of die ze hebben verzameld op basis van uw gebruik van hun services. Meer informatie.

Akkoord

Vraag & Antwoord

Webprogrammeren & scripting

MySQL: voorwaarden halen uit andere tabel

Anoniem
sanchises
3 antwoorden
  • Beste,

    Voor een forum-applicatie wil ik slechts de ongelezen items als resultaat van een query. Ik heb twee tabellen:
    [code:1:87ec590857]
    Items
    ————————–
    ID | EditedOn | content etc
    ——–|——————
    1 | 12363 | bla bla
    2 | 1245546 | etc
    3 | 235346 | etc

    Markers
    ————————————
    Member | ItemID | TimeStamp
    ——-|——–|————–
    1 | 2 | 123546
    3 | 2 | 125678
    1 | 1 | 467423

    [/code:1:87ec590857]
    Ik wil content uit Items halen volgens de volgende voorwaarden:
    -Stel, we beginnen bij de eerste rij van Items.
    -Zoek uit Markers de rijen waarbij geldt Markers.ItemID=Items.ID
    -Zoek uit die rijen de rij waarbij geldt dat Markers.Member gelijk is aan de php-variabele $member
    -Nu moet de waarde uit die rij bij TimeStamp worden vergeleken met EditedOn. Als de TimeStamp nieuwer (dus groter) is dan EditedOn, OF de bovenstaande stappen heeft GEEN Marker-rij opgeleverd, dan moet de huidige rij van Items in het resultaat worden opgenomen.
    -Herhaal voor alle rijen.

    Ingewikkeld verhaal, maar volgens mij moet het enigzins kunnen.
  • Volgens mij beschrijf je het zelf al een groot deel:
    [code:1:3fd6048c08]$query = "SELECT * FROM `Items`
    JOIN `Markers` ON `Items`.`ID` = `Markers`.`ItemID`
    WHERE `Markers`.`TimeStamp` > `Items`.`EditedOn`
    AND `Markers`.`Member` = '" . $member . "'";[/code:1:3fd6048c08]

    Die query haal je door je databasehandler en dan zou je al een heel eind moeten zijn volgens mij.
  • waarschijnlijk wil je de items tonen die of niet zijn gelezen (geen marker aanwezig) of zijn bewerkt na de laatste lezing (EditedOn [b:23c506ced4]>[/b:23c506ced4] TimeStamp)

    Probleem van Gers oplossing is dat alleen de Items worden opgehaald waarvoor een marker is voor de gekozen member.

    Je kunt nu verschillende aanpakken kiezen:
    1. gebruik Gers query voor het ophalen van de items waarin je [b:23c506ced4]niet[/b:23c506ced4] bent geinteresseerd (Marker.Timestamp >= Item.EditedOn) en gebruik NOT IN of NOT EXISTS om die Items op te halen behalve degenen die je niet wilt

    2. herschrijf Gers query om rekening te houden met het afwezig kunnen zijn van een marker-entry (LEFT-JOIN + M.ItemID IS NULL)
    [code:1:23c506ced4]SELECT * FROM Items I
    LEFT JOIN Markers M ON I.ID=M.ItemID
    WHERE ( M.TimeStamp < I.EditedOn
    AND M.Member = {huidige_member} )
    OR M.ItemID IS NULL
    [/code:1:23c506ced4]
    NB: deze verdient niet de voorkeur vanwege onleesbaarheid in LEFT JOIN en OR IS NULL

    3. er voor zorgen dat zodra een item wordt bewerkt de gezette markers voor dat item en voor alle leden worden verwijderd. Je kunt je dan beperken tot het aanwezig zijn van een marker, dat maakt het gemakkelijker. Deze oplossing kan alleen wanneer je nu of in de toekomst verder niets wil met het tijdstip van lezen.

Beantwoord deze vraag

Dit is een gearchiveerde pagina. Antwoorden is niet meer mogelijk.