ugrás a tartalomhoz

Left Join ?

Anonymous · 2006. Aug. 14. (H), 20.27
Eloszor is mySQL 4.1-es adatbazist hasznalok!

Van egy PHP szkript amely 2 option/select menut jelenit meg. Az egyik menu bal oldalon a masik jobb oldalon lathato.

menu1 menu2

A bal oldalon levo menu tartalmaza az osszes felhasznalo nevet a register mySQL tablabol, a jobb oldali menu pedig ures.

<?php
$users = mysql_query("SELECT user_id, username FROM register");
?>
<select name="sel1[]" size="10" multiple="multiple" style="width: 100px">
<?php
while ($row = mysql_fetch_array($users)) {
print "<option value=\"{$row['user_id']}\">{$row['username']}</option>\n";
} 
?>
</select>
A bal oldali menubol a felhaznalokat at tudom rakni a jobb oldali menübe.
Most peldaul atrakok ket felhasznalot a jobb oldali menube.

Van egy submit gomb is a lapon. Ha erre a gombra katintok akkor azokat a
felhasznalokat akiket a jobb oldali menube raktam berakja egy mySQL tablaba a kov. keppen:

uid   |    gid
1           2
3           2
A tabla neve user2groups, es jelenleg az elso szamu es a harmas szamu felhasznalot berakata a masodik csoportba.

Azt szeretnem ha ezek a felhasznalok mar tagja a masodik csoportnak akkor ne jelenitse meg oket a bal oldali menuben, ha ujbol beolvasom a PHP szkriptet.

Allitolag LEFT JOIN-t kene hasznalnom. Valaki tudna segiteni egy peldaval ?

Kosz !
 
1

(rtfm)

dummy · 2006. Aug. 14. (H), 21.28
SELCT user_id, username
FROM register
LEFT JOIN user2groups ON(register.user_id = user2groups.uid)

Egyébként meg RTFM !
2

kosz

Anonymous · 2006. Aug. 14. (H), 22.49
kosz a valaszt de nem az amire nekem szuksegem van.
Nem mukodik a peldad!
3

ok

Anonymous · 2006. Aug. 14. (H), 23.09
Kozben elolvastam a manualt.

A kovetkezo keppen mukodik :

SELECT user_id, username FROM register LEFT JOIN user2groups ON(register.user_id = user2groups.uid) WHERE user2groups.uid IS NULL
Most kilistaza csak azokat a felhasznalokat akik nem voltak hozaadva a masodik csoporthoz..

Most azt szeretnem hogy jojon elo ujbol az osszes felhasznalo a ball oldali menuben ha a 3-ik csoportba adom hozza oket.

Mindegyik csoportnak megvan a ket menuje. Bal es jobb menuk.
4

.csoport

Anonymous · 2006. Aug. 14. (H), 23.24
a kovetkezo linkel ertesitem a szkriptet, hogy melyik csoportot kell editalni:

selgroup.php?id=2
selgroup.php?id=3
5

segitseg

Anonymous · 2006. Aug. 14. (H), 23.42
Kerek segitseget ! Nem hiszem el, hogy senki ne tudjon egy valaszt adni !
6

kérdezz okosan + türelem

Hodicska Gergely · 2006. Aug. 15. (K), 01.01
Szia!


Ha egy kicsit összeszedettebben kérdezel, akkor nagyobb eséllyel fogsz megfelelő választ kapni, ezenkívül nem érdemes "Nem hiszem el, hogy senki ne tudjon egy valaszt adni !" típusú hozzászólásokat tenni, mert ezzel nem érsz el semmit.

Amire pedig szükséged van: még egy plusz feltétel az összekapcsolásban:
SELECT user_id, username FROM register LEFT JOIN user2groups ON(register.user_id = user2groups.uid AND user2groups.gid = 2) WHERE user2groups.uid IS NULL
Ezzel csak azok a userek lesznek kizárva, akik a kettes csoport tagjai.


Felhő
7

Te találtad ki?

Dualon · 2006. Aug. 15. (K), 03.15
A scriptet egyébként Te találtad ki? Gyanúsan olyan, mintha valamiből, valaki más ötletéből összehegesztetted volna.
8

ok

Anonymous · 2006. Aug. 15. (K), 08.42
Persze, hogy en talaltam ki.
9

Akkor?

Dualon · 2006. Aug. 15. (K), 11.05
Egy ilyen komplexitású rendszer már feltételezné, hogy utána tudsz nézni pl. a JOIN szintaxisának, mi több, ki is tudod próbálni.
10

ok

Anonymous · 2006. Aug. 15. (K), 11.52
ok.. eppen beleutkoztem egy problemaba.

Van ket menu, az elso ahogy irtam tartalmaza az osszes felhasznalot, a masodik azokat a felhasznalokat amiket en hozaadtam a csoporthoz.

A kov koddal adom hozza oket a csoporthoz.

if (isset($_POST['submit'])) {
$_POST['sel2'] = array();

foreach($_POST['sel2'] as $elem) {
mysql_query("DELETE FROM user2groups WHERE uid='".$elem."' AND gid='".$groupnum."'");
mysql_query("INSERT INTO user2groups (uid, gid) values ('".$elem."', '".$groupnum."')");
}
Felteszem, hogy hozzaadom az oszes felhasznalot az elso menubol a masodikba, most raklikelek a submit gombra. Minden OK ! Mukodik a dolog. A regi adatokat torli es az ujakat hozzaadja.

Valahogy igy nez ki:

Menu1              Menu2
                   User1
                   User2
                   User3
Most az a gond hogy, vissza szeretnek rakni egy felhasznalot a masodik menubol az elsobe, es azt torolje is a kovetkezo submitnel a user2groups tablabol. Amit a tablabol torolnie kell a kov: uid=3 AND gid=2

Menu1              Menu2
User3              User1
                   User2
O torolni is akarja de mar nem talalja a masodik tablaba a felhasznalot amit atraktam.

Hogyan lehetne megoldani ? Otlet is jo lenne, hogy ne mondjatok, hogy lama vagyok es csak kodot jovok kerni.
11

kerdes

Anonymous · 2006. Aug. 15. (K), 12.08
Egy olyan mySQL query kell amely elenorzi, hogy az elso tablaban melyik uzernek van egy megfeleloje az user2groups tablaban. Peldaul latja, hogy at volt rakva user3, es torli a kov sort az user2groups tablabol:

uid  gid
===  ===
3     2
Ehhez mit kell hasznalnom, RIGHT JOIN-t?
12

Vonatkoztass el

Dualon · 2006. Aug. 15. (K), 12.54
Vonatkoztass el az apró részletektől, a joinoktól, miegyébtől: tekintsd át a problémát.

Három halmazod van:
1. Menu1
2. Menu2
3. X táblában rögzített felhasználók (ez lehet bármelyik tábla!)

Szándéktól függ, melyiket kell behelyettesítened, de tegyük fel, hogy Menu1-ből pakoltál át usereket Menu2-be (vagy akár vissza, netán ide is, oda is), és a Menu2 usereit akarod rögzíteni táblában. Tegyük fel azt is, hogy Menu2 userei tartoznak egy adott csoportba.

  • User szerepel Menu2-ben is, és X táblában is.
    -> nem kell hozzáadni, sem törölni, jó helyen van ott...
  • User szerepel Menu2-ben, X táblában nem.
    -> INSERT
  • User nem szerepel Menu2-ben, X táblában igen (kikerült a csoportból).
    -> DELETE


Submit után Menu2 elemeit tömbben kapod (legyen ez a select tömb).
Szintén submit után lekéred X tábla soraiból a usereket, ezeket szintén tömbben tárolod (legyen ez a tábla tömb).

A két tömb különbségét veszed, vagyis törlöd mindazon tömbelemeket (usereket), melyek mindkét tömbben szerepelnek (hisz ők a Menu2-ben + X táblában is jelenlévő userek, lásd fentebbi felsorolás első pontja).
-> a select tömbben maradó userek mehetnek INSERT-tel X táblába
-> tábla tömbben maradó usereket törölni kell DELETE-tel X táblából

Ha nem vagy SQL mágus, ez pl. egy megoldás.

U.I.: "Érdekes" a stílusod, úgyhogy ha megengedsz egy tanácsot (szigorúan privát vélemény): változtass rajt, hosszú távon megbosszulja magát.
13

kosz

Anonymous · 2006. Aug. 15. (K), 13.11
Ezt minek vegyem fenyegetesnek ?
Figyu, azert van forum, hogy kerdezek. Ha nem tetszik valamelyik moderatornak akkor banoljon ki, az sem erdekel. Ha pedig nem akkor ne valaszolj es az is megteszi.
14

kerdes

Anonymous · 2006. Aug. 15. (K), 15.26
Mivel lehet osszehasonlitani a peldadban megadott tomboket ? array_diff ?
15

OFF: csak így tovább!

Dualon · 2006. Aug. 15. (K), 20.37
Ezt minek vegyem fenyegetesnek ?


Nyilván.
Látatlanban is elhiszem, hogy a Te édesapád erősebb.

Ha pedig nem akkor ne valaszolj es az is megteszi.


Így lesz, Anonymous.