9
votes

Correspondant à une valeur à plusieurs colonnes (dans une instruction) d'une table à l'aide de MySQL

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)
)


2 commentaires

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.


9 Réponses :


0
votes

Vous pouvez utiliser des vecteurs dans mysql: xxx

méfiez de différentes collations de serveur et de client pour les colonnes de texte, vous devrez éventuellement spécifier des collations explicitement. >


2 commentaires

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 pour obtenir des métadonnées de table, puis utilisez les champs des requêtes ultérieures?



0
votes

À 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é.
Voici les tableaux: xxx

et voici le SQL: xxx

Les résultats seraient xxx


1 commentaires

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.



0
votes
select * from table where 1 in (january, february)

1 commentaires

Non, ce n'est pas ça non plus. Merci pour la suggestion cependant.



1
votes

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> xxx pré>

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";


0 commentaires

1
votes

Vous pouvez le faire en utilisant le match ... contre.

Dans ce cas, votre table doit être une table MyISAM et vous devez créer un index completText, y compris les colonnes requises.


0 commentaires

0
votes

Comment dires-vous de résoudre le problème avec une vue? XXX PRE>

Insertion de données: P>

id | or_over_months
1  | 1
2  | 1
4  | 1


0 commentaires

4
votes

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')


2 commentaires

Je penserais que l'OP voudrait ou au lieu de et . N'oubliez pas non plus de vérifier schema_name 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 s? L'OP dit explicitement "janvier = 1er et février = 1".



1
votes

Essayez de créer une vue xxx

Vous obtiendrez quelque chose comme ceci: xxx

et ensuite vous pouvez interroger < Pré> xxx

ou si vous voulez une requête "Obtenez toutes les lignes, où feb = 1", vous pouvez écrire comme ceci: xxx

où '_ 'correspond exactement à un caractère.


1 commentaires

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.



0
votes

Ce dont vous avez besoin est une opération de pivotement. Microsoft SQL Server prend en charge pivot et improvembre 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.

Vous ne pouvez pas utiliser Fulltext Rechercher dans ce cas, car comme les docs Dites :

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.

Et il ne vous relâcherait pas de ne pas avoir besoin de spécifier les colonnes de toute façon, car la correspondance MATCH () Prédicate nécessite de répertorier tous les colonnes dans l'index Fulltext. < / p>

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.


0 commentaires