Je travaille avec une table dans MySQL contenant les colonnes suivantes:
select * from table
where
(
match (somehow,get,the,table,columns,I,need,here)
against (1 in boolean mode)
)
9 Réponses :
Vous pouvez utiliser des vecteurs dans mysql: méfiez de différentes collations de serveur et de client pour les colonnes de texte, vous devrez éventuellement spécifier des collations explicitement. P> P> P> >
Ce n'est pas ce que je cherche, je ne veux pas spécifier les noms de colonne. Bon concept, cependant, les vecteurs sont utiles.
Pas très clair alors. Vous souhaitez utiliser des colonnes de table dans l'expression sans spécifier les noms informatiques? Peut-être que vous alliez d'abord exécuter décrire la table code> pour obtenir des métadonnées de table, puis utilisez les champs des requêtes ultérieures?
À mon avis, cela est causé à partir de ce qui semble être une mauvaise conception de la table (je suppose que c'est juste un exemple pour simplement votre problème, mais supporte avec moi, et je pense que ce concept pourrait être mieux modélisé. et voici le SQL: p> Les résultats seraient p>
Voici les tableaux:
Jay, tu as raison, c'est à cause d'une mauvaise conception de table. Je ne suis cependant pas autorisé à changer la structure de la table.
select * from table where 1 in (january, february)
Non, ce n'est pas ça non plus. Merci pour la suggestion cependant.
Je comprends ce que M.smith essaie de faire.
C'est une question de 12 lignes x 4 colonnes contre 1 rangée x 12 colonnes. p>
L'ancienne conception de la table serait quelque chose comme: P>
ID, ID de quelqu'un, mois, valeur x 12 par mois strong> p> La déclaration SQL correspondante serait la suivante: P> $sqlQuery = "SELECT corrensponding_column_names_to_where_clause FROM my_month_table WHERE column_value = 1";
Vous pouvez le faire en utilisant le match ... contre. p>
Dans ce cas, votre table doit être une table MyISAM et vous devez créer un index completText, y compris les colonnes requises. P>
Comment dires-vous de résoudre le problème avec une vue? Insertion de données: P> id | or_over_months
1 | 1
2 | 1
4 | 1
Vous devez utiliser une déclaration préparée, car ce que vous voulez faire ne peut être effectué qu'avec dynamique SQL:
SELECT CONCAT_WS(' AND ', CONCAT(column_name, ' = 1 '))
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name = 'YOUR_TABLE'
AND table_schema = 'db_name'
AND column_name NOT IN ('id')
Je penserais que l'OP voudrait ou code> au lieu de et code>. N'oubliez pas non plus de vérifier schema_name code> dans le schéma d'informations, au cas où il y a une table du même nom dans un autre schéma.
@Bill: THX, a ajouté le chèque manquant du nom du schéma. Êtes-vous sûr d'utiliser ou code> s? L'OP dit explicitement "janvier = 1er et février = 1".
Essayez de créer une vue Vous obtiendrez quelque chose comme ceci: p> et ensuite vous pouvez interroger p> < Pré> xxx pré> ou si vous voulez une requête "Obtenez toutes les lignes, où feb = 1", vous pouvez écrire comme ceci: p> où '_ 'correspond exactement à un caractère. P> p>
L'utilisation de la fonction et du filtrage sur ses résultats sera une catastrophe pour la performance. La base de données devra évaluer la fonction pour toutes les lignes de la table, puis comparer la sortie de celle de la chaîne que vous correspondez. Utilisation de la sortie des fonctions, directement ou indirectement, dans un prédicat de requête (où la clause) est un non-non général pour la performance.
Ce dont vous avez besoin est une opération de pivotement. Microsoft SQL Server prend en charge Vous ne pouvez pas utiliser Les index de texte intégral ne peuvent être utilisés qu'avec des tables MyISAM et peuvent être créées uniquement pour les colonnes de caractères, de Varchar, ou de texte. p>
blockQuote>
Et il ne vous relâcherait pas de ne pas avoir besoin de spécifier les colonnes de toute façon, car la correspondance Si vous ne pouvez pas restructurer la table pour stocker une ligne par mois ou une colonne unique pour encoder tous les 12 mois, vous devez donc générer SQL dynamique. P> pivot code> et improvembre code> comme extensions sur SQL standard. Je ne connais aucune autre marque de RDBMS qui prend en charge la fonctionnalité intégrée de pivot / impucheurs. Certes, MySQL ne supporte pas cela. P>
Fulltext CODE> Rechercher dans ce cas, car comme les docs Dites : P>
MATCH () CODE> Prédicate nécessite de répertorier tous les colonnes em> dans l'index Fulltext. < / p>
Qu'est-ce que vous testez exactement à la clause "Où table.Columns = 1"? Voulez-vous les enregistrements où exactement l'un de janvier, février, etc. en est un?
Je veux obtenir toutes les lignes contenant 1 dans l'une des colonnes de la table.