2016-07-28 4 views
1

У меня есть сообщение, откуда вы можете выбрать категорию, к которой будет принадлежать ваше сообщение. Вы можете выбрать максимум 5 различных категорий (теги).Поиск из столбца mysql

Сохраняет эти теги в том же столбце в mysql.

id user title body    tags      Date 
1  6 Functions .... javascript,jquery,html,mysql 2016-07-27 

id INT NOT NULL AUTO_INCREMENT, 
PRIMARY KEY(id), 
user TEXT, 
title TEXT, 
body TEXT, 
tags TEXT, 
date DATE, 

Если поиск пользователей для яваскрипта сообщений он должен показать все сообщения, которые имеют тег яваскрипта включен теги столбца.
Как мне выбрать mysql с PHP?

ответ

4

Все остальные ответы, скорее всего, будут работать, но вы должны рассмотреть возможность нормализации таблицы. Хранение этого как csv будет сложно поддерживать.

Удалите tags столбец из того, что я буду называть ваш post стола в результате (вы должны рассмотреть хранящий user_id больше name):

+----+------+-----------+------+------------+ 
| id | user | title | body | Date | 
+----+------+-----------+------+------------+ 
| 1 | Tony | Functions | .... | 2016-07-27 | 
+----+------+-----------+------+------------+ 

Теперь создайте post_category таблицу, которая будет заполнена, как это.

+----+---------+------------+ 
| id | post_id | tag  | 
+----+---------+------------+ 
| 1 | 1  | javascript | 
| 2 | 1  | jquery  | 
| 3 | 1  | html  | 
| 4 | 1  | mysql  | 
+----+---------+------------+ 

post_id является foreign key к post таблицы id колонки.

Теперь вы можете сделать запрос типа (не проверено):

SELECT post.* FROM post 
#Joins are intimidating at first 
#but a pretty important concept to learn 
JOIN post_category ON post.id = post_category.post_id 
WHERE post_category.tag LIKE '%javascript%' 

Создание таблицы tag бы также рекомендуется, чтобы вы могли контролировать теги пользователи могут использовать. Это было бы похоже на вышесказанное. Если вы хотите, чтобы какой-нибудь пример дал мне знать.

Дополнительная информация для комментариев

Поскольку вы получаете строку CSV для INSERT вы можете сделать что-то вроде этого:

//Create your post and get the id. 
$string = "javascript,jquery,html,mysql"; 
$post_cats = explode(',', $string); //This is an array broken at , 
foreach($post_cats as $post_cat){ 
    //Do your insert with $post_cat it is a string and the post_id you have 
} 

Дополнительная информация для комментариев по поводу таблицы тегов

Таблицу не составит труда создать. Это будет Id, который является primary key и name потенциально description, но я оставлю это сейчас.

+----+-----------+ 
| id | name  | 
+----+-----------+ 
| 1 |javascript | 
| 2 |jquery  | 
| 3 |html  | 
| 4 |mysql  | 
+----+-----------+ 

Теперь вы просто обновить post_category таблицу, чтобы иметь tag_id как foreign key к tag стола id

+----+---------+--------+ 
| id | post_id |tag_id | 
+----+---------+--------+ 
| 1 | 1  | 1  | 
| 2 | 1  | 2  | 
| 3 | 1  | 3  | 
| 4 | 1  | 4  | 
+----+---------+--------+ 

Теперь ваш запрос становится (не проверено)

SELECT post.* FROM post 
JOIN post_category ON post.id = post_category.post_id 
JOIN tag ON tag.id = post_category.tag_id 
WHERE post_category.post_id = 1 

Хитрость дает пользователю интерфейс для выбора нескольких тегов, но это еще одна тема.

+0

Большое спасибо. Я буду использовать это – Tonza

+0

Как сделать Mysql 'post_category' INSERT в форме сообщения. У меня есть строка, подобная этой 'javascipt, jquery, php'. Должен ли я сделать 3 разных запроса mysqli? – Tonza

+1

Вам больше не понадобится предложение 'LIKE', если вы это сделаете. –

4

Вы использовать wildcard search ...

SELECT * FROM `table` WHERE `tags` LIKE '%javascript%' 

Но вы можете пересмотреть свой макет таблицы, что делает его более нормальным.

2
SELECT * FROM tbl WHERE tags LIKE '%javascript%'; 

Возможно, это поможет.

2

Я хотел бы использовать найти в наборе для MySql

FIND_IN_SET DOCS

SELECT * from table where FIND_IN_SET('javascript',tags)>0; 

Но я не большой поклонник сервировки стола. Нормализованные данные для баз данных и сохранение нескольких значений в 1 столбце не нормируются.

1

Лучший способ - использовать функцию find_in_set() mysql.

select * from my_table where find_in_set('javascript', tags) > 0; 

find_in_set() Обратите внимание, что функция не чувствительны к регистру поэтому использование javascript или Javascript в приведенном выше запросе будет производить один и тот же результат.

Если вы хотите использовать его для нескольких значений, вы можете использовать OR в ИНЕКЕ:

select * from my_table where find_in_set('javascript', tags) > 0 or find_in_set('MySql', tags) > 0; 
Смежные вопросы