02. april 2006 - 17:35Der 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?
"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
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.
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å ;-)
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)
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)
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++) {
$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; }
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.