1
votes

Masquer automatiquement les choix qui sont complets et insérer toutes les données dans une autre table

J'ai la base de données suivante composée des champs suivants.

table_choice

field_choiceid(auto increment) (2, 4)

field_choicename (C2, C4)

field_choicemaximumslot (12, 18)


table_select

field_selectedid(auto increment)

field_selectedchoice

field_selectedby


table_full_choice

field_fullid(auto increment) (1, 2, 3)

field_choiceid_full (1, 3, 5)

field_choicename_full (C1, C3, C5)

field_choicemaximumslot_full (10, 15, 20)



table_full_select

field_selectedid_full (1 to 45)

field_selectedchoice_full (C1(10 times), C3(15 times), C5(20 times))

field_selectedby_full (Person1 to Person45)

Et j'utilise ce code pour remplir automatiquement ma liste déroulante.

<label>CHOICE</label>

<select value="" name="choice" id="choice" required>

<option>SELECT</option>

<?php

$result=mysqli_query($connection,"SELECT * FROM table_choice")or die(mysqli_error,());

while($row=mysqli_fetch_array($result)){

$choiceid=$row['field_choiceid'];
$choicename=$row['field_choicename'];
$choiceslot=$row['field_choiceslot'];
?>

<option value="<?php echo $choicename;?>">

<?php echo $choicename;?>

</option>

<?php } ?>

</select>


5 commentaires

pouvez-vous nous montrer votre résultat attendu? cette question n'est toujours pas claire


Les résultats attendus dans la liste déroulante sont ceux qui ne sont pas encore pleins sont visibles dans la liste déroulante et ceux qui sont pleins ne sont pas visibles dans la liste déroulante. Exemple: la liste d'origine dans la liste déroulante est C1 C2 C3 C4 C5 car ils ne sont pas encore pleins mais alors C1 est plein 10/10 et C3 est plein 15/15 et C5 est plein 20/20 alors la liste déroulante doit avoir C2 C4 seul.


Avez-vous le nombre de personnes inscrites et combien peuvent s'inscrire dans la base de données?


Chaque donnée stockée dans field_choicename peut être définie combien peuvent sélectionner ce choix (minimum 10, maximum 20), elles sont stockées dans field_choicemaximumslot. L'administrateur peut mettre combien il / elle veut 10 à 20 emplacements.


Dans votre question, il y a déjà 3 réponses. Il est conseillé d'appuyer sur la flèche vers le haut et sur la coche si l'un d'entre eux est utile et a résolu votre problème.


3 Réponses :


0
votes

Si vous pouvez ajouter le nombre de personnes inscrites et le nombre maximum de personnes qui peut s'inscrire à la base de données, vous pouvez le faire de cette façon.

<form>  
     <select name = "CourseList">

<?php

    $result = mysqli_query($connection,"SELECT * FROM table_choice")or   die(mysqli_error,());

    while($row = mysqli_fetch_array($result)){

        $choiceid = $row['field_choiceid'];
        $choicename = $row['field_choicename'];
        $choiceslot = $row['field_choiceslot'];
        $HowMany = $row['How_Many'];
        $Maximum = $row['Maximum'];

        if(HowMany != Maximum){
            echo "<option value = "$choiceid" selected>$choicename</option>\n";
    }
?>
     </select>
</form>


3 commentaires

Et si je ne peux ajouter que le nombre (maximum) de personnes pouvant sélectionner un choix spécifique. L'administrateur peut définir le champ field_choicemaximumslot sur 10 ou 11 ou 12 ou 13 ou 14 ou 15 ou 16 ou 17 ou 18 ou 19 ou 20, puis s'il est défini sur 10, 10 est l'emplacement maximum. Ensuite, si 10 personnes sur 15 qui se sont inscrites ont sélectionné le C1 (a field_choicemaximumslot défini sur 10), C1 disparaîtra / se cachera dans la liste déroulante afin que je puisse éviter 11/10, tous les choix dans la liste déroulante qui atteignent l'emplacement maximum disparaîtront /cacher.


Vous devrez garder une trace du nombre de personnes pour pouvoir l'arrêter. La meilleure façon de faire est de mettre à jour la base de données pour indiquer le nombre de personnes inscrites.


@Comet mais d'un autre côté l'approche que @BadSly utilise permet de garder une trace de qui a rejoint aussi si le table_select est modifié en conséquence.



1
votes

Vous pouvez utiliser SQL JOIN pour sélectionner.

Si vous ne l'avez pas fait, vous devez ajouter une clé étrangère pour les champs table_choice.field_choiceid et table_select.field_selectedchoice

J'espère que je n'ai pas d'erreur mais ce code devrait fonctionner. Mais essayez d'abord la sélection.

<form>  
    <select name = "CourseList">
<?php

    $result=mysqli_query($connection,"SELECT tc.*, count(ts.field_selectedchoice) AS c_selected FROM table_choice tc LEFT JOIN table_select ts ON ts.field_selectedchoice = tc.field.choiceid GROUP BY tc.field_choiceid")or die(mysqli_error,());

    while($row=mysqli_fetch_array($result)){

        $choiceid=$row['field_choiceid'];
        $choicename=$row['field_choicename'];
        $choiceslot=$row['field_choiceslot'];
        $maxchoice=$row['field_choicemaximumslot'];
        $selectcount=$row['c_selected'];

        if ($maxchoice > $selectcount){
            echo '<option value='.$choiceid.'>'.$choicename.'</option>';
        }
    ?>
    </select>

S'il y a une erreur dans l'instruction SQL, je vais essayer de la corriger. p>


0 commentaires

0
votes

Malheureusement, je vous souhaite humblement la bienvenue à stackoverflow!

Selon votre problème, @Spirit dit que vous pouvez les LEFT JOIN , après cela, vous pouvez le filtrer en utilisant le HAVING mot réservé. Sur ce, je filtre les leçons qui sont déjà pleines (pour autant que j'ai compris dans votre question) après avoir toutes réunies.

Pour plus d'informations sur la référence à ce morceau de documentation . Vous trouverez également plus d'informations sur les différences entre HAVING et WHERE dans cette information: https://stackoverflow.com/a/2905312/4706711

Je crée un échantillon de votre base de données dans sqlfiddle http://sqlfiddle.com/#!9/df211f/4/0 pour des raisons d'exhaustivité, la base de données exemple est construite comme ça: p>

<label>CHOICE</label>

<select value="" name="choice" id="choice" required>

<option>SELECT</option>

<?php

$result=mysqli_query($connection,"SELECT * FROM view_table_choice WHERE view_table_choice.c_selected < view_table_choice.field_choicemaximumslot")or die(mysqli_error,());

while($row=mysqli_fetch_array($result)){

$choiceid=$row['field_choiceid'];
$choicename=$row['field_choicename'];
$choiceslot=$row['field_choiceslot'];
?>

<option value="<?php echo $choicename;?>">

<?php echo $choicename;?>

</option>

<?php } ?>

</select>

Comme vous pouvez le voir la requête:

CREATE VIEW view_table_choice AS SELECT table_choice.*, count(table_select.field_selectedchoice) 
AS c_selected FROM table_choice LEFT JOIN table_select
ON table_select.field_selectedchoice = table_choice.field_choiceid
GROUP BY table_choice.field_choiceid;

filtrera les options indésirables. Ainsi, vous pouvez utiliser votre code avec une torsion:

<label>CHOICE</label>

<select value="" name="choice" id="choice" required>

<option>SELECT</option>

<?php

// Is good idea to fetch the required fields and no more.
$query="SELECT table_choice.field_choicename as field_choicename, count(table_select.field_selectedchoice) AS c_selected FROM table_choice LEFT JOIN table_select ON table_select.field_selectedchoice = table_choice.field_choiceid GROUP BY table_choice.field_choiceid HAVING c_selected < table_choice.field_choicemaximumslot";

$result=mysqli_query($connection, $query)or die(mysqli_error,());

while($row=mysqli_fetch_array($result)){
$choicename=$row['field_choicename'];
?>
<option value="<?php echo $choicename;?>">
<?php echo $choicename;?>
</option>
<?php } ?>

De plus, pour garder les choses propres dans votre code, vous pouvez créer une vue basée sur la requête que vous voulez. À titre d'exemple dans votre cas, vous pouvez créer la vie comme ça:

SELECT table_choice.*, count(table_select.field_selectedchoice) 
AS c_selected FROM table_choice LEFT JOIN table_select
ON table_select.field_selectedchoice = table_choice.field_choiceid
GROUP BY table_choice.field_choiceid HAVING c_selected < table_choice.field_choicemaximumslot;

Vous pouvez faire référence à des vues dans ce morceau de mysql documentation .

Donc, en utilisant la vue, le code sera: p >

CREATE TABLE table_choice(
  field_choiceid INT UNSIGNED NOT NULL PRIMARY KEY,
  field_choicename VARCHAR(2) CHARACTER SET utf8 COLLATE utf8_unicode_ci,
  field_choicemaximumslot INT UNSIGNED NULL
);

CREATE TABLE table_select(
  field_selectedid INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
  field_selectedchoice INT UNSIGNED NOT NULL,
  FOREIGN KEY fk_select(field_selectedchoice) REFERENCES table_choice(field_choiceid) ON DELETE CASCADE ON UPDATE CASCADE
);

INSERT INTO table_choice VALUES (1,'C1',10),(2,'C2',12),(3,'C3',15),(4,'C4',18),(5,'C5',20);
insert into table_select(field_selectedchoice) VALUES (1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(4),(5),(3),(2),(2),(2),(5),(4);

Et vous pouvez apprécier son apparence plus soignée. Afin de mettre à jour votre base de données actuelle, vous pouvez créer un script de migration php pour le faire où exécutera la requête CREATE VIEW .


2 commentaires

Je ne peux pas utiliser mes deux INSERT INTO en utilisant deux requêtes par un bouton lorsque j'ai inséré une clé étrangère.


Je modifie ma requête et maintenant elle ne sauvegarde que dans 1 table.