Avatar billede doomstone-dk- Nybegynder
02. april 2006 - 17:35 Der er 13 kommentarer og
2 løsninger

Skal have en sql select

Jeg har lidt problemer med en sql select som jeg skal lave.

Jeg har 2 tabeller.

------ SQL KODE ----

CREATE TABLE `sms` (
  `id` int(11) NOT NULL auto_increment,
  `medlemnr` int(11) NOT NULL default '0',
  `name` varchar(64) NOT NULL default '',
  `nr` int(11) NOT NULL default '0',
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=117 ;

CREATE TABLE `sms_grupper` (
  `id` int(11) NOT NULL default '0',
  `gruppe` int(11) NOT NULL default '0'
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--------------------------

databasen "sms" indeholder mine medlemmer med deres mobil nr .
databasen "sms_grupper" indeholder hvilke grupper mit medlem er medlem af.
f.eks
id    gruppe
1    1        //Betyder at bruger med id 1 er medlem af gruppet 1
1    5    //Betyder at bruger med id 1 også er medlem af gruppet 5

Hvordan kan jeg lavet et sql select som selecter medlemmer som er medlem af gruppe 1 OG gruppe 5?
Avatar billede tangveje Nybegynder
02. april 2006 - 18:20 #1
Jeg vil umidelbart sige at du er nødt til at gøre det af 2 omgange.

Første henter du alle medlemmer som er i begge grupper.

$res = mysql_query( "SELECT id FROM sms_grupper WHERE gruppe = 1 AND gruppe = 5" ) ;

Så looper du igennem alle resultaterne

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

og henter oplysninger for hver enkelt

$id = $row['id'] ;
$bruger = mysql_fetch_array( mysql_query( "SELECT * FROM sms WHERE id = '$id'" ) ) ;

Eller noget i den stil
Avatar billede doomstone-dk- Nybegynder
02. april 2006 - 18:32 #2
Hmm problemet er at det skal være dynamisk.
så jeg også kan selecte medlemmer ud fra 4 eller op til 10 grupper
Avatar billede doomstone-dk- Nybegynder
02. april 2006 - 18:33 #3
"SELECT id FROM sms_grupper WHERE gruppe = 1 AND gruppe = 5"
VIl give mig alle medlemmer fra gruppe 1 or 5
jeg vil have alle medlemmer som er medlem af gruppe 1 og 5
Avatar billede tangveje Nybegynder
02. april 2006 - 18:44 #4
"så jeg også kan selecte medlemmer ud fra 4 eller op til 10 grupper"

Jeg tror ikke jeg er helt med så. Mener du så du kan hente brugere som er medlem af f.eks. 1,3,5 og 7 eller 2,4 og 10?

"VIl give mig alle medlemmer fra gruppe 1 or 5
jeg vil have alle medlemmer som er medlem af gruppe 1 og 5"

Er det ikke det samme?
Avatar billede tangveje Nybegynder
02. april 2006 - 19:00 #5
Unskyld, du har ret, det giver jo slet ingen mening det jeg skrev. Bare glem mit svar.
Avatar billede stieper Nybegynder
02. april 2006 - 22:01 #6
doomstone-dk-

Hvor mange grupper har du i alt?

Den måde du bygger dit table "sms-grupper" op på virker for mig ulogisk.

Hvis du i stedet for din eksisterende struktur, laver en tabel i stil med:

---sms-grupper--
id(int 11)
gruppe1(tinyint 1)
gruppe2(tinyint 1)
gruppe3(tinyint 1)
osv..

Her skal hvert `id`, repræsentere dine brugere fra tabellen `sms` - hvilket vil sige at de er unikke og at du derfor yderligere kan lave et primært index på dem.
Hver `gruppe` sættes til 0, hvis brugeren ikke er medlem af denne gruppe, og til 1 hvis brugeren er medlem af den pågældende gruppe.

Herefter bliver det simpelt:

$sql = "SELECT * FROM `sms-grupper` WHERE `gruppe1` = 1 AND `gruppe4`= 1";
$result = mysql_query($sql) or die(mysql_error());

Og du kan så smide dem i et array med mysql_fetch_array eller mysql_fetch_assoc.

Generelt er det altid en fordel at have et primært index i HVER tabel i din database, samtidig med at du kan lave krydsreferencer mellem disse. I dette tilfælde mellem `id` i din `sms` tabel og `id` i din `sms-grupper` tabel.

Håber dette kan hjælpe dig lidt.
Avatar billede stieper Nybegynder
02. april 2006 - 22:05 #7
Ok - en lille fejl har sneget sig ind i min forklaring.

`id` feltet i din sms-gruppe table skal være (int 11) og referere til feltet `medlemnr` i din sms table.
Jeg går ud fra at hver bruger har et unikt medlemnr, og derfor kan du stadig lave et primært index herpå ;-)
Avatar billede erikjacobsen Ekspert
02. april 2006 - 22:14 #8
Du får nok brug for en subselect. Er din mysql-version større end 4.1 ??
Avatar billede doomstone-dk- Nybegynder
03. april 2006 - 00:42 #9
stieper: sådan har jeg ikke mulighed for at lave det, da antallet af grupper dynamisk, altser at min bruger selv kan tilføje/slette grupper
Avatar billede doomstone-dk- Nybegynder
03. april 2006 - 15:31 #10
MySQL 5.0.17-nt
Avatar billede doomstone-dk- Nybegynder
03. april 2006 - 17:51 #11
Jeg ved ikke lige hvordan subsql virker.
Avatar billede erikjacobsen Ekspert
04. april 2006 - 09:34 #12
Det kan nok gøres på flere måder. En simpel er at få en liste fra din anden tabel, med dem, der er i de relevante grupper, og så bruge den til at udvælge fra første tabel - du laver selv navne om osv. Og er der andet end lige 2 grupper, skal du også ændre 2-tallet ved count(*)

select id,navn from tabel1 where id in
    (SELECT id from tabel2 where gruppe in (2,5) group by id HAVING count(*)>=2)
Avatar billede stieper Nybegynder
04. april 2006 - 11:44 #13
Her er et forslag, som er testet, og som virker. SQL arbejdet kan måske gøres smartere, så du ikke behøver at loope gennem hver bruger i en while sætning, men det kan andre så komme med forslag til.

1. Den fil du bruger til at angive hvilke grupper der skal vælges, skal indeholde følgende (Jeg har kaldt den subform.php)

----subform.php----
<form name="form1" method="post" action="subselect.php">
  <p>Gruppe 1:
    <input name="1" type="checkbox" id="1" value="1">
  Gruppe 2:
  <input name="2" type="checkbox" id="2" value="2">
  Gruppe3:
  <input name="3" type="checkbox" id="3" value="3">
  Gruppe4:
  <input name="4" type="checkbox" id="4" value="4">
  Gruppe5:
  <input name="5" type="checkbox" id="5" value="5">
  Gruppe6:
  <input name="6" type="checkbox" id="6" value="6">
  Gruppe7:
  <input name="7" type="checkbox" id="7" value="7">
  Gruppe8:
  <input name="8" type="checkbox" id="8" value="8">
  Gruppe9:
  <input name="9" type="checkbox" id="9" value="9">
  Gruppe10:
  <input name="10" type="checkbox" id="10" value="10">
</p>
  <p>
    <input type="submit" name="Submit" value="Submit">
</p>
</form>



2. Denne fil opfanger grupperne fra subform.php (jeg har kaldt den subselect.php)

--- subselect.php ---

<?php
//find ud af hvor mange grupper medlemmet SKAL være medlem af... (Går ud fra det bliver sendt via en form med $_POST[''])
$groups = array();
for($i=0; $i<11; $i++) {
   
    if(!$_POST[$i] == "") {
        array_push($groups, $i);
    }

}

$array_count = count($groups); //Hvor mange grupper skal være valgt?


$in = $groups[0];                    //først sættes den første gruppe vi skal have fat i.
for($i=1; $i<$array_count; $i++) { //Herefter sættes de næste grupper adskilt af komma til vores mysql sætning.

$in .= ",$groups[$i]";

}   

//så udfører vi mysql arbejdet med de ovenstående variable.
//HUSK at forbinde til din database først!
$sql = "SELECT `id` FROM `sms_grupper` WHERE `gruppe` IN ($in) GROUP BY `id` HAVING COUNT(*)>=$array_count";
$result = mysql_query($sql) or die(mysql_error());
$num_rows = mysql_num_rows($result);

if($num_rows > 0) { //Hvis der findes brugere som er medlem af de valgte grupper, henter vi deres data.
    while($row = mysql_fetch_assoc($result)) {
        $sql_user = "SELECT * FROM `sms` WHERE `medlemnr` = $row[id] LIMIT 1";
        $result_user = mysql_query($sql_user) or die(mysql_error());
        $row_user = mysql_fetch_assoc($result_user);
        echo "Brugernavn: $row_user[name] Telefonnr: $row_user[nr] <br>";
    }
} else {
    echo "Der er desværre ingen brugere som er medlem af alle de valgte grupper";
    exit;
    }
   
?>
Avatar billede stieper Nybegynder
24. juli 2006 - 01:02 #14
Tak for accept af svar - men mere vigtigt - fandt du ud af en løsning på udfordringen??
Avatar billede doomstone-dk- Nybegynder
24. juli 2006 - 13:18 #15
Ja tak for hjælpen :D
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester