[PHP/MySQL] Union/Join

Pagina: 1
Acties:

Onderwerpen


  • Noxious
  • Registratie: Juli 2002
  • Laatst online: 19-09 22:46
Ik heb op het moment de volgende query:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
      $query = "SELECT * FROM enabledlist WHERE site='" . addslashes($_GET["site"]) . "' AND type='0'";
      $result = mysql_query($query);
      while($listitem = mysql_fetch_array($result)){
       $query2 = "SELECT * FROM packages WHERE ID='" . $listitem["package"] . "' AND Type='" . $systemtype . "';";
       $result2 = mysql_query($query2);
       while($package = mysql_fetch_array($result2)){
        if($package["Default"] == 1){
         $output.="                <input type=\"checkbox\" name=\"package" . $package["ID"] . "\" CHECKED>" . $package["Name"] . "<br>\n";
        }else{
         $output.="                <input type=\"checkbox\" name=\"package" . $package["ID"] . "\">" . $package["Name"] . "<br>\n";
        }
       }
      }


Deze tabelletjes zien er als volgt uit:
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
mysql> describe packages;
+---------------------+---------------------+------+-----+---------+----------------+
| Field               | Type                | Null | Key | Default | Extra    |
+---------------------+---------------------+------+-----+---------+----------------+
| ID                  | bigint(20) unsigned | NO   | PRI | NULL    | auto_increment |
| Name                | tinytext            | NO   |     |         |    |
| Path                | tinytext            | NO   |     |         |    |
| Default             | char(1)             | NO   |     | 0       |    |
| Type                | char(1)             | NO   |     | 2       |    |
| restartafter        | char(1)             | NO   |     |         |    |
| softwareversion     | varchar(20)         | NO   |     |         |    |
| lastsoftwareversion | varchar(20)         | NO   |     |         |    |
| internalname        | varchar(45)         | NO   |     |         |    |
| versionno           | int(10) unsigned    | NO   |     |         |    |
| layer               | varchar(45)         | NO   |     |         |    |
+---------------------+---------------------+------+-----+---------+----------------+
11 rows in set (0.08 sec)


SQL:
1
2
3
4
5
6
7
8
9
10
mysql> describe enabledlist;
+---------+---------------------+------+-----+---------+----------------+
| Field   | Type                | Null | Key | Default | Extra          |
+---------+---------------------+------+-----+---------+----------------+
| ID      | bigint(20) unsigned | NO   | PRI | NULL    | auto_increment |
| package | bigint(20)          | NO   |     |         |                |
| site    | bigint(20)          | NO   |     |         |                |
| type    | char(1)             | NO   |     | 0       |                |
+---------+---------------------+------+-----+---------+----------------+
4 rows in set (0.08 sec)


Het nadeel is dat op deze manier de results ongesorteert zijn terwijl ze eigenlijk op alfabetische volgorde moeten staan.

Ik begrijp dat dit met een Union en/of Join zou moeten kunnen zodat ik maar 1 query hoef uit te voeren, maar ik kom er niet uit.

SQL:
1
2
mysql> (select package as flpkg from enabledlist where site = 1 and type = 0) union (select * from packages where ID = flpkg);
ERROR 1054 (42S22): Unknown column 'flpkg' in 'where clause'


Ik heb de MySQL manual al doorgekeken maar vind daar zo snel geen duidelijke voorbeelden, ook wat random MySQL tuts helpen me nog niet echt verder, kan iemand me in de juiste richting schoppen?

Alvast bedankt :P

  • Noork
  • Registratie: Juni 2001
  • Niet online
Gebruik een join. zie b.v. hier: http://www.w3schools.com/Sql/sql_join.asp

Wat snap je er precies niet aan? Heb je al een query geprobeerd?

Verwijderd

SELECT * FROM ? WHERE ? ORDER BY ? ASC/DESC
(oftewel: zoek jij de order by-clausule?)

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 21-09 14:53

MueR

Admin Tweakers Discord

is niet lief

Ik kan zo even geen wijs worden uit wat je precies wilt bereiken. Wat ik zo zie is dat je een lijst met packages wilt op basis van actieve packages in een site, toch?
SQL:
1
2
SELECT p.* FROM packages p 
JOIN enabledlist e ON e.package = p.ID AND e.site = 1 AND e.type = 0
ofzo :?

Anyone who gets in between me and my morning coffee should be insecure.


  • Noxious
  • Registratie: Juli 2002
  • Laatst online: 19-09 22:46
De order bij zoek ik niet nee ;) ik ga even Noork z'n linkje checken.

  • Noxious
  • Registratie: Juli 2002
  • Laatst online: 19-09 22:46
MueR schreef op donderdag 12 februari 2009 @ 11:10:
Ik kan zo even geen wijs worden uit wat je precies wilt bereiken. Wat ik zo zie is dat je een lijst met packages wilt op basis van actieve packages in een site, toch?
SQL:
1
2
SELECT p.* FROM packages p 
JOIN enabledlist e ON e.package = p.ID AND e.site = 1 AND e.type = 0
ofzo :?
Omg dat exact dus _O_ ietwat aangepast naar:

SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
mysql> SELECT p.Name FROM packages p JOIN enabledlist e ON e.package = p.ID AND
e.site = 1 AND e.type = 0 ORDER BY Name;
+--------------------------------------------------------+
| Name                                                   |
+--------------------------------------------------------+
| 1Localization - BE                                     |
| 1Localization - NL                                     |
| 1Localization - UK                                     |
| 7-Zip 4.57                                             |
| Adobe Reader 8.1                                       |
| CBS-IRIS 2008                                          |
| Citrix ICA Client 10.0 NL Preconf                      |
| Citrix XenApp Plugin 11.0                              |
| IrfanView 4.1.0                                        |
| IrfanView 4.1.0 Plugins                                |
| McAfee NAI (ePOAgent)                                  |
| Microsoft Office 2000 Standard SP3 (Dutch)             |
| WIBU-Key Network Server Monitor                        |
| X AutoCAD 2008 Hotfix Package                      |
| X DLL Package for Fenix, CadPlan, AceDraw and more |
| X DNS Zone list for Western Europe                 |
| XML Notepad 2006                                       |
+--------------------------------------------------------+
17 rows in set (0.13 sec)


_O_ dankje

Uiteraard moet ik meer hebben dan alleen de naam, maar dit was voor de test :P

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 21-09 14:53

MueR

Admin Tweakers Discord

is niet lief

Maar heb je er nu iets van opgestoken dan?

Anyone who gets in between me and my morning coffee should be insecure.


  • Noork
  • Registratie: Juni 2001
  • Niet online
MueR schreef op donderdag 12 februari 2009 @ 11:13:
Maar heb je er nu iets van opgestoken dan?
Haha, had dan niet een complete oplossing gegeven. :*)

  • Noxious
  • Registratie: Juli 2002
  • Laatst online: 19-09 22:46
Mja als ik het goed begrijp doe je dit:

SELECT p.Name FROM packages p JOIN enabledlist e ON e.package = p.ID AND
e.site = 1 AND e.type = 0 ORDER BY Name;

'packages p' -> een soort van alias aanmaken voor packages namelijk 'p' (korter), same met enabledlist 'e'.
met de JOIN - andere tabel - ON tabel.veld - moet gelijk zijn aan - eerste tabel.veld en met de AND's de overige needs zoals site=1 en type=0.

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 21-09 14:53

MueR

Admin Tweakers Discord

is niet lief

Noork schreef op donderdag 12 februari 2009 @ 11:15:
[...]

Haha, had dan niet een complete oplossing gegeven. :*)
Mjah, ik kan er niks aan doen. Dit was nattevingerwerk :s
Noxious schreef op donderdag 12 februari 2009 @ 11:16:
Mja als ik het goed begrijp doe je dit:

SELECT p.Name FROM packages p JOIN enabledlist e ON e.package = p.ID AND
e.site = 1 AND e.type = 0 ORDER BY Name;

'packages p' -> een soort van alias aanmaken voor packages namelijk 'p' (korter), same met enabledlist 'e'.
met de JOIN - andere tabel - ON tabel.veld - moet gelijk zijn aan - eerste tabel.veld en met de AND's de overige needs zoals site=1 en type=0.
Correct. Maar zou je het voor een andere tabel ook _zelf_ kunnen. Het verklaren van een query die werkt is meestal wel te doen.

[ Voor 58% gewijzigd door MueR op 12-02-2009 11:18 ]

Anyone who gets in between me and my morning coffee should be insecure.


  • Noxious
  • Registratie: Juli 2002
  • Laatst online: 19-09 22:46
Ik heb nog een paar tabellen te gaan ;) komt dus wel goed.

PHP:
1
2
3
4
5
6
7
8
9
       $query2 = "SELECT p.* FROM packages p JOIN enabledlist e ON e.package = p.ID AND e.site = ".addslashes($_GET["site"])." AND e.type = 0 AND p.Type = ".$systemtype." ORDER BY Name;";
       $result2 = mysql_query($query2);
       while($package = mysql_fetch_array($result2)){
        if($package["Default"] == 1){
         $output.="                <input type=\"checkbox\" name=\"package" . $package["ID"] . "\" CHECKED>" . $package["Name"] . "<br>\n";
        }else{
         $output.="                <input type=\"checkbox\" name=\"package" . $package["ID"] . "\">" . $package["Name"] . "<br>\n";
        }
       }


Dit werkt in ieder geval, en nu is m'n result netjes gesorteert op naam. Voorheen was dat niet mogelijk aangezien het altijd een while-in-while van de 'enabledlist' was wat er voor zorgde dat het een beetje gesorteert was op datum van toevoeging (id).
Pagina: 1