Une instruction préparée, `WHERE .. IN (..)` requête et tri - avec MySQL
Imaginons que nous ayons une requête:
SELECT * FROM somewhere WHERE `id` IN(1,5,18,25) ORDER BY `name`;
et un tableau d'Id de fetch: $ids = array(1,5,18,25)
Avec des déclarations préparées à l'avance c'est conseillé de préparer une déclaration et appel à de multiples reprises:
$stmt = $mysqli->prepare('SELECT * FROM somewhere WHERE `id`=?;');
foreach ($ids as $id){
$stmt->bind_params('i', $id);
$stmt->exec();
}
Mais maintenant je vais avoir à les trier manuellement. Dois-je tout de belles alternatives?
source d'informationauteur kolypto | 2010-09-13
Vous devez vous connecter pour publier un commentaire.
vous pourriez faire de cette façon:
À l'aide de ce que vous appelez bind_param pour chaque id et vous avez le tri fait par mysql.
Je crois que c'est le plus simple possible réponse :
Si longtemps votre tableau d'Id ne contient pas les touches ou les touches avec des caractères illégaux, il travaillera.
Je vais ajouter finalement une lente & laid solution qui utilise néanmoins des déclarations préparées pour n'IMPORTE quel nombre d'éléments du tableau 🙂 3 états sont universels pour tous les cas et peut être réutilisé partout.
CREATE TEMPORARY TABLE
id(
idINT );
INSERT INTO
idVALUES(?);
cela permettra d'insérer votre IdSELECT
idFROM
idLEFT JOIN .... ;
utiliser les données d'autres tables pour trier lesids
listeSELECT
idFROM
id;
sélectionnez toutSinon, vous devrez utiliser
IN (?,?,?,....
ou trier les lignes manuellement. La meilleure idée est d'utilisation simple MySQL-requêtes, ou essayer d'obtenir la liste des Identifiants déjà triés dans la façon dont vous le souhaitez.Eu le même problème et en plus de la réponse de @traîneau il y a 7 ans, voici une possibilité sans faire le
call_user_func_array(array($stmt, 'bind_param'), $ids);
étape, mais seulement appel bind_params une fois:Une alternative serait d'utiliser PHP usort la fonction de l'objet de résultat, mais c'est "manuel".
Voir ceci:
Sorte d'Objet en PHP
Non, il n'est pas recommandé, si vous êtes à récupérer certains enregistrements de la base de données à l'aide de
ORDER BY
clause.Avez-vous envisagé de vous réécriture de requête d'origine à l'aide d'une JOINTURE et la clause where pour obtenir les ID vous avez besoin pour éviter la nécessité d'une clause where IN? Je suis venu ici avec la même question, et après avoir examiné les solutions possibles, j'ai réalisé une JOINTURE INTERNE a été ma solution.