[PHP + SQL] Union limit probleem

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
hmm ik heb een query waar 3 tabellen door UNION samengevoegd worden.
De bedoeling is dat er in een tabel maximaal 5 waardes weergegeven worden (de laatste 5)
Echter worden er nu 15 waardes weergegeven want van elke tabel worden nu de laatste 5 weergegeven. Iemand iets om dit op te lossen de de drie tabellen samen te voegen, zodat uit alle drie de tabellen in totaal maar 5 waardes gehaald wordt.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
      <table class="content2" cellpading="0" cellspacing="0">
        <tr>
          <td class="contenttitelborder1" align="center" width="195">De laatste artikelen</td>
        </tr>

        <?
        $select = mysql_query(" 
                       (Select vis_id, vis_naam, vis_datum, vis_zoek, vis_zoekcat, vis_url FROM admin_vis ORDER BY vis_naam DESC limit 5) 
                       UNION                          
                       (Select plant_id, plant_naam, plant_datum, plant_zoek, plant_zoekcat, plant_url FROM admin_plant ORDER BY plant_naam DESC limit 5)
                       UNION                          
                       (Select aquarium_id, aquarium_naam, aquarium_datum, aquarium_zoek, aquarium_zoekcat, aquarium_url FROM admin_aquarium ORDER BY aquarium_naam DESC limit 5)
             ") or die("er is iets fout! " . mysql_error());
        if($aantal == '0') {     
         
         
        echo "<div align='center' class='warning'>Helaas, er zijn geen resultaten gevonden op <i>".$_POST['trefwoord']."</i></div>";     
            
             
    } else {     
     
 
    while ($row = mysql_fetch_assoc ($select)) 
    {     
            if($row['vis_zoek'] = 1) 
            {
    echo "<tr>";     
    echo "<td class='contenttitelborder3'><a href='".$row[vis_url]."".$row[vis_id]."' titel='".$row[vis_zoekcat]."'>".$row[vis_naam]."</a></td>";     
    echo "</tr>"; 
        } 
            elseif($row['plant_zoek'] = 2) 
            {
    echo "<tr>";     
    echo "<td class='contenttitelborder3'><a href='".$row[plant_url]."".$row[plant_id]."' titel='".$row[plant_zoekcat]."'>".$row[plant_naam]."</a></td>";     
    echo "</tr>";
        } 
            elseif($row['aquarium_zoek'] = 3) 
            {
    echo "<tr>";     
    echo "<td class='contenttitelborder3'><a href='".$row[aquarium_url]."".$row[aquarium_id]."' titel='".$row[aquarium_zoekcat]."'>".$row[aquarium_naam]."</a></td>";     
    echo "</tr>";
        }

   }  
    }    
?>

        </tr>
        <tr>
          <td class="contenttitelborder3" align="right"><a class="standaardsmall" href="?p=home">Naar Artikelen...</a></td>
        </tr>
      </table>

Acties:
  • 0 Henk 'm!

  • Spider.007
  • Registratie: December 2000
  • Niet online

Spider.007

* Tetragrammaton

Hoeveel vissen, planten en aquariums wil je hebben? Of moet de SQL server dat zelf bepalen ofzo? Of moet de complete resultset met namen alfabetisch worden geordened om dan vervolgens de laatste 5 entries eruit te halen? Als je trouwens maar 5 results wil; waarom limit je al je queries dan niet op 5 en doe je vervolgens de filteringe van 15>5 handmatig in PHP?

---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Spider.007 schreef op woensdag 28 december 2005 @ 00:25:
Hoeveel vissen, planten en aquariums wil je hebben? Of moet de SQL server dat zelf bepalen ofzo? Of moet de complete resultset met namen alfabetisch worden geordened om dan vervolgens de laatste 5 entries eruit te halen? Als je trouwens maar 5 results wil; waarom limit je al je queries dan niet op 5 en doe je vervolgens de filteringe van 15>5 handmatig in PHP?
Het kan zijn dat de laatste 5 artikelen uit vis komen, maar het kan ook zijn dat er 3 uit vis komt, 1 uit plant en 1 uit aquarium. in totaal mogen het er dus maar 5 zijn. Naar mijn mening heb ik de queries toch gelimiteerd op 5? Hoe doeik de filtering van 15>5 handmatig in php?

Acties:
  • 0 Henk 'm!

  • GambitRS
  • Registratie: Juni 2001
  • Laatst online: 13-06-2013

GambitRS

w00t

Als je nou alles in 1 tabel stopt en een extra kolom aanmaakt met een naam als 'itemtype' waarvan de waarde 'vis','planten' of 'aquarium' kan zijn dan heb je je probleem opgelost. Ook al heeft elke tabel meer waarden die niet generaliseerbaar zijn dan nog kan je de gezamenlijke kolommen in een super tabel stoppen en de overige kolommen in sub tabellen stoppen.

Of je wacht tot MySQL ook views kan gebruiken, dan maak je een view van de drie tabellen en vraag je vervolgens de 5 nieuwste op.

[ Voor 47% gewijzigd door GambitRS op 28-12-2005 00:45 ]

MechWarrior || Monsters Game


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
de kolom aquarium_zoek, vis_zoek en plant_zoek is zo'n soorteglijk kollom.

Acties:
  • 0 Henk 'm!

  • _Sunnyboy_
  • Registratie: Januari 2003
  • Laatst online: 13:08

_Sunnyboy_

Mooooooooooooooooo!

Rare query heb je daar.

Weet je zeker dat je nooi een vis, plant of naam met dezelfde id hebt? Anders weet je na zo'n query dus niet meer welke gegevens bij welk record komen.

Oh ik zie dat je dat met vis_zoek etc. doet. Ik weet niet of je nog veeel meer in die tabellen hebt staan, maar dit vraagt om een tabel. Die zoekvelden kan je dan vervangen door een type veld met daarin vis, plant aquarium (bijv in een enum).

Zo niet dan zou ik in ieder geval zorgen dat een plant en een vis nooit dezelfde id kunnen hebben wat betekent dat je autoincrement dus niet kan gebruiken, maar een sequence moet gebruiken. mysql ondersteund sequences niet echt, al kan je ze vrij simpel namaken.

Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life


Acties:
  • 0 Henk 'm!

Verwijderd

Je PHP code toont aan dat je niet door hebt wat een union doet.

Eerst combineer je drie tabellen tot 1 resultset en dan heb je toch het rare idee dat de kolomnamen anders zijn als je een vis retourneert dan wanneer je een aquarium hebt. Dat is dus niet zo.

Je while lus kan dus vereenvoudigd worden tot
code:
1
2
3
4
5
6
  while ($row = mysql_fetch_assoc ($select)) 
    {     
    echo "<tr>";     
    echo "<td class='contenttitelborder3'><a href='".$row[vis_url]."".$row[vis_id]."' titel='".$row[vis_zoekcat]."'>".$row[vis_naam]."</a></td>";     
    echo "</tr>"; 
  }


Maar goed, zoals anderen al gezegd hebben is het ook nog eens niet zo zinvol om aparte tabellen te maken voor vissen, planten en aquariums als je er vrijwel hetzelfde in stopt.
Logischer is het om een tabel te maken met alle vissen, planten e.d. erin en een type veld. Speciale kenmerken van de vis,plant of ander object kun je dan in een aparte tabel stoppen die een 1 op 1 relatie heeft met je hoofdtabel.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Wokee ik ben nu een tabel aan het maken waar ik de drie onderwerpen (vis, plant en aquarium) samenvoeg. Veel werk, maar het zal de oplossing geven.... bedankt voor jullie inspanning
Pagina: 1