[mysql] resultaten van 2 queries 'onder' elkaar

Pagina: 1
Acties:
  • 142 views sinds 30-01-2008
  • Reageer

  • js303
  • Registratie: April 2003
  • Laatst online: 08-05 18:22
ik probeer een lijst met resultaten te tonen uit 2 verschillende tabellen. bijv:

tabel: pages -> velden: id, titel
tabel: articles -> velden: id, titel

wat ik nu wil is zo'n soort resultatenlijst:
row    type     id      label
-----------------------------
1      page     101     About us
2      article  78      Bookstore
3      article  3       Financial Information
4      page     59      Welcome to this site
5      article  162     Zomaar een artikel


waarbij dus de resultaten van de 2 verschillende tabellen met elkaar gemixed zijn omdat ik bijv. op label heb gesorteerd. ik heb al lopen stoeien met aliases voor de veldnamen en IF() statements, JOINs maar ik kom er niet uit.

de reden dat ik niet 2 losse queries wil uitvoeren, is omdat ik eerst een query wil uitvoeren op beide tabellen die het totaal aantal results geeft middels COUNT(), zodat ik vervolgens via LIMIT een range kan selecteren en deze kan weergeven, terwijl middels paging links naar de andere pagina's met results worden weergegeven.

wat ook helaas - ivm de architectuur en de tijd die het me kost dit om te schrijven - geen optie is, is om de 2 tabellen samen te voegen en in de nieuwe tabel een enum-veld toe te voegen "page | article" :|

[ Voor 13% gewijzigd door js303 op 28-02-2005 14:45 ]


  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 14-05-2024

OZ-Gump

terug van weggeweest

Volgens mij is UNION wat je zoekt. Weet alleen niet of je die in MySQL kunt gebruiken ... ?

edit:
Blijkbaar wel dus ;)
UNION is used to combine the result from many SELECT statements into one result set. UNION is available from MySQL 4.0.0 on

[ Voor 66% gewijzigd door OZ-Gump op 28-02-2005 14:49 ]

My personal website


  • js303
  • Registratie: April 2003
  • Laatst online: 08-05 18:22
UNION - ik draai mysql 3.23 en deze functie is pas vanaf 4.0 beschikbaar. maar bedankt voor de tip, ik ga UNION eens beter bestuderen.
An alternative, rather simpler (especially with very complex select statements) way to 'use union' in 3.x might be the following:

Build a nice union query. (save it somewhere, so you can use that if you upgrade)
If you would say that query was '(*cool_select_statement_1*) UNION (*cool_select_statement_2*) *order_and_group_by_stuff*'.
You could make an replacement set of query's like this:
CREATE TEMPORARY TABLE temp_union TYPE=HEAP *cool_select_statement_1*;
INSERT INTO temp_union *cool_select_statement_2*;
SELECT * FROM temp_union *order_and_group_by_stuff*;
DROP TABLE temp_union;

Note that I've use a HEAP and TEMPORARY table because that combination is rather fast and, well, temporary.
You can't execute these query's on one line (well I coudn't), so it would look like this in PHP:
mysql_query('CREATE..', $connection);
mysql_query('INSERT..', $connection);
$query = mysql_query('SELECT..', $connection);
mysql_query('DROP..', $connection);

[ Voor 89% gewijzigd door js303 op 28-02-2005 14:50 ]


  • stp_4
  • Registratie: Maart 2003
  • Laatst online: 30-04 19:47
Tsja, het maken van een temp table kan inderdaad ook. Kun je niet migreren naar versie 4.0 dan?

stp - PSN ID: stp_4


  • js303
  • Registratie: April 2003
  • Laatst online: 08-05 18:22
stp_4 schreef op maandag 28 februari 2005 @ 14:53:
Tsja, het maken van een temp table kan inderdaad ook. Kun je niet migreren naar versie 4.0 dan?
ik denk wel dat dit te upgraden valt, echter ben ik niet op de hoogte met backwards-compatibaliteit, maw dat bepaalde queries die ik nu voor 3.x heb gemaakt wellicht niet (goed) meer werken met 4.0.

  • BierPul
  • Registratie: Juni 2001
  • Laatst online: 12:44

BierPul

2 koffie graag

Ben ik nog niet tegengekomen iig :)

Als je queries maar netjes zijn (in hoeverre mySQL dat checked :X ) is er niks aan de hand B)

Ja man


  • js303
  • Registratie: April 2003
  • Laatst online: 08-05 18:22
ok die user comment van mysql.com heb ik geprobeerd en die werkt wel goed voor pre 4.0 mysql users die een UNION willen simuleren. voor evt. geinteresseerden hier een voorbeeldje (uiteraard de SELECTs aanpassen naar eigen wens):

PHP:
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
<?php

    include("inc/config.php");
    include("inc/db.php");

    dbconnect();

    $sql= "CREATE TEMPORARY TABLE temp_union TYPE=HEAP SELECT a.id, a.title, 'article' AS 'type' FROM ws_articles a";
    $res = mysql_query($sql) or exit(mysql_error());

    $sql= "INSERT INTO temp_union SELECT pg.Page_Id 'id', pg.Page_Label 'title', 'page' AS 'type'  FROM ws_pages pg";
    $res = mysql_query($sql) or exit(mysql_error());

    $sql= "SELECT * FROM temp_union ORDER BY title ASC";
    $res = mysql_query($sql) or exit(mysql_error());

    $i=0;

    print "<table border=1 cellpadding=0 cellspacing=0>";

    while ($row = mysql_fetch_assoc($res)) {

        if ($i == 0) {
            print "<tr>";
            while (list($fld, $val) = each($row)) {
                print "<td>$fld</td>";
            }
            print "</tr>";
            reset($row);
        }

        print "<tr>";
        while (list($fld, $val) = each($row)) {
            print "<td>$val</td>";
        }
        print "</tr>";
        $i++;

    }

    print "</table>";

    $sql= "DROP TABLE temp_union";
    $res = mysql_query($sql) or exit(mysql_error());

    mysql_close();
?>


output:
idtitletype
100Advertisingpage
7Apple is van plan 'mini' stores op te zetten in Europaarticle
99Bookstorepage

[ Voor 52% gewijzigd door js303 op 28-02-2005 16:40 ]

Pagina: 1