J'ai un tableau comme ci-dessous, le nom de la table est js_skills_achievements

id   skill1  skill2  skill3  skill4
1     java    php    html    android
2     php     java   jquery  html
3     sql     php    html    jquery

Lorsque la clé de recherche de l'administrateur est "développeur java dans nersupalli"

Ma requête est ci-dessous

SELECT *
FROM `js_skills_achievements`
WHERE `skill1`  LIKE '%java developer in nersupalli%'
   OR `skill2`  LIKE '%java developer in nersupalli%'
   OR `skill3`  LIKE '%java developer in nersupalli%'
   OR `skill4`  LIKE '%java developer in nersupalli%'
ORDER BY id DESC
LIMIT 10

Ça ne fonctionne pas pour moi . Ma condition est que je dois afficher tous les enregistrements Java. ici un total de 2 enregistrements en java. c'est-à-dire id1, id2. Mais je reçois des lignes vides.

Ci-dessous les moyens ne fonctionnent que

SELECT *
FROM `js_skills_achievements`
WHERE `skill1`  LIKE '%java%'
   OR `skill2`  LIKE '%java%'
   OR `skill3`  LIKE '%java%'
   OR `skill4`  LIKE '%java%'
ORDER BY id DESC
LIMIT 10

J'ai besoin en fonction de la recherche par mot-clé spécifiée par chaîne. pouvez-vous quelqu'un s'il vous plaît aider à ce sujet. Suis très apprécié. Merci

3
Niranjan Kumar Chowdam 16 nov. 2017 à 13:54

5 réponses

Meilleure réponse

Ajoutez du texte intégral dans votre champ

ALTER TABLE `js_skills_achievements` ADD FULLTEXT(`skill1`);
ALTER TABLE `js_skills_achievements` ADD FULLTEXT(`skill2`);
ALTER TABLE `js_skills_achievements` ADD FULLTEXT(`skill3`);
ALTER TABLE `js_skills_achievements` ADD FULLTEXT(`skill4`);

Et puis exécutez cette requête

SELECT * FROM js_skills_achievements
WHERE MATCH(skill1,skill2,skill3,skill4) AGAINST ('java developer in nersupalli');
1
Subhankar Mitra 16 nov. 2017 à 11:02
SELECT *
FROM `js_skills_achievements`
WHERE '%java developer in nersupalli%' LIKE CONCAT('%',skill1,'%')
   OR '%java developer in nersupalli%' LIKE CONCAT('%',skill2,'%')
   OR '%java developer in nersupalli%' LIKE CONCAT('%',skill3,'%')
   OR '%java developer in nersupalli%' LIKE CONCAT('%',skill4,'%')
ORDER BY id DESC
LIMIT 10;
0
Ponni 16 nov. 2017 à 11:31

D'autres réponses sont plus techniques et probablement plus optimisées, mais si vous souhaitez avoir un contrôle total sur votre requête, comme changer OR en AND et des choses comme ça, vous pouvez diviser votre requête en mots et la construire manuellement:

//your search query
$query = 'java developer in nersupalli';

//in case you want to add more skills later
$skills = ['skill1', 'skill2', 'skill3', 'skill4'];

//split your query in an array of words
$words = explode(' ', $query);

//build the sql
$condOuter = '';
foreach($skills as $skill){
    $condInner = '';
    foreach($words as $word){
        $condInner .= " OR `$skill` LIKE '%$word%'";
    }
    $condInner = substr($condInner, 4);
    $condOuter .= " OR ($condInner)";
}
$condOuter = substr($condOuter, 4);
$sql = 'SELECT * FROM `js_skills_achievements` WHERE ' . $condOuter . ' ORDER BY id DESC LIMIT 10;';
0
Kaddath 16 nov. 2017 à 11:22

Vous pouvez exploser la chaîne de recherche sur un espace

$words = explode ( ' ' , $string);

Que rechercher tous les mots dans skill1. Tous les mots de skill2 etc.

0
Graham 16 nov. 2017 à 11:02

Une façon un peu moche de faire cela est d'inverser vos clauses similaires et de faire correspondre votre chaîne à des colonnes

SELECT 
  * 
FROM
  js_skills_achievements 
WHERE 'java developer in nersupalli' LIKE CONCAT('%',skill1,'%')
  OR 'java developer in nersupalli' LIKE CONCAT('%',skill2,'%')
  OR 'java developer in nersupalli' LIKE CONCAT('%',skill3,'%')
  OR 'java developer in nersupalli' LIKE CONCAT('%',skill4,'%')
  OR skill1  LIKE '%java developer in nersupalli%'
  OR skill2  LIKE '%java developer in nersupalli%'
  OR skill3  LIKE '%java developer in nersupalli%'
  OR skill4  LIKE '%java developer in nersupalli%'
ORDER BY id DESC 
LIMIT 10 

Démo

2
M Khalid Junaid 16 nov. 2017 à 11:03
47327797