Форум программистов, компьютерный форум, киберфорум
PHP: базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 09.02.2014
Сообщений: 11

Сделать поиск в БД, по навыкам (skills) пользователя (ID)

23.04.2014, 09:43. Показов 930. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
База данных:

ID=1
SKILLS=C, PHP, HTML, CSS, Javascript, JQuery, Autodesk Maya

ID=2
SKILLS=Android, C++, Arduino, ObjectiveC

...

Задача: Сделать поиск в БД, по навыкам (SKILLS) пользователя (ID)

__________________

Я попробовал написать так:

PHP
1
2
3
4
5
6
7
8
9
$skills = $_POST['skills'];
 
$bdQuery = mysql_query("SELECT * FROM students WHERE skills LIKE '%$skills%'");
 
$bdArray = mysql_fetch_array($bdQuery);  
 
do{
   printf ("%s<br>", $bdArray["id"]);
} while($bdArray = mysql_fetch_array($bdQuery));
но вышла проблема, код фильтрует не совсем так как я хочу. Если в БД написано "C, PHP, HTML", а я задаю в поиске "С, HTML", код проходит мимо нее...
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.04.2014, 09:43
Ответы с готовыми решениями:

Как сделать поиск пользователя не по id, а по имени?
Здравствуйте форумчане. у меня такой вопрос. Есть профиль пользователя( зареганного) кол такой : $resultat =...

Практическое применение теоретическим навыкам
Ребят, начал учить c#, но не знаю, что делать с моими знаниями, подкиньте пару задач не сложных или ресурс на котором они есть.

программа процесса обучения простейшим навыкам программирования на я звук пролог
нужно создать программу обучения простейшим навыкам программ ирования на языке пролог Добавлено через 23 часа 12 минут помогите...

8
91 / 91 / 23
Регистрация: 02.09.2013
Сообщений: 276
23.04.2014, 09:58
Потому что архитектура кривая.
SKILLS - это должна быть отдельная таблица
И должна быть таблица связка many-to-many, в которой будут связываться IDшники чуваков, с IDшниками скиллом.
И в запросе нужно будет использовать JOIN

Добавлено через 2 минуты
students:
id, name

skills:
id, name

student_skill:
student_id, skill_id

student_id и skill_id - внешние ключи на students.id и skills.id соответственно
0
112 / 93 / 15
Регистрация: 03.10.2012
Сообщений: 315
23.04.2014, 11:12
Цитата Сообщение от Zvook Посмотреть сообщение
внешние ключи на students.id и skills.id соответственно
Внешние ключи - зло для Highload, которым проект станет рано или поздно. Достаточно составного PRIMARY KEY по student_id + skill_id
0
91 / 91 / 23
Регистрация: 02.09.2013
Сообщений: 276
23.04.2014, 12:15
Внешние ключи - зло для Highload, которым проект станет рано или поздно. Достаточно составного PRIMARY KEY по student_id + skill_id
Если уж на то пошло, то вся реляционная БД зло для хайлоад проекта.
А внешние ключи созданы, как ни странно, для того, чтобы их использовать. И это именно тот случай когда их нужно использовать, как минимум чтобы сохранить целостность данных.
Впринципе, ТСу это не принципиально, система будет работать и без ключей.
0
112 / 93 / 15
Регистрация: 03.10.2012
Сообщений: 315
23.04.2014, 12:22
Цитата Сообщение от Zvook Посмотреть сообщение
Если уж на то пошло, то вся реляционная БД зло для хайлоад проекта.
Ну, как-то на реляционной БД отлично работает проект с 3 млн. продуктов с описаниями на 48 языках и ничего не зло.
Цитата Сообщение от Zvook Посмотреть сообщение
А внешние ключи созданы, как ни странно, для того, чтобы их использовать. И это именно тот случай когда их нужно использовать, как минимум чтобы сохранить целостность данных.
На этапе тестирования внешние ключи могут ой как крови попить, если не использовать фикстуры.
Цитата Сообщение от Zvook Посмотреть сообщение
Впринципе, ТСу это не принципиально, система будет работать и без ключей.
Да, будет, но с какой скоростью? EXPLAIN всему голова.
0
23.04.2014, 12:29

Не по теме:

r3ntg3n, ладно, не будем разводить холивар :)

0
23.04.2014, 12:33

Не по теме:

Согласен ;)

0
0 / 0 / 0
Регистрация: 09.02.2014
Сообщений: 11
23.04.2014, 23:47  [ТС]
Добавлено через 29 минут
В общем разобрался сам. Пошарился в коде. Вот как надо было сделать:

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    $skills = $_POST['skills'];
    $arr = explode(', ', $skills);
    $arrNum = count($arr);
    $arrQuery = "";
    
    for($i = 1; $i < $arrNum; $i++){
        $arrQuery .= "AND skills LIKE '%$arr[$i]%' ";
    }
 
    $bdQuery = mysql_query("SELECT * FROM students WHERE skills LIKE '%$arr[0]%' $arrQuery");                   
 
    $bdArray = mysql_fetch_array($bdQuery);  
    do{ 
        printf ("%s<br>", $bdArray["id"]);
    } while($bdArray = mysql_fetch_array($bdQuery));
0
112 / 93 / 15
Регистрация: 03.10.2012
Сообщений: 315
23.04.2014, 23:49
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
CREATE TABLE students (
    id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50) NOT NULL
);
 
CREATE TABLE skills (
    id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50) NOT NULL
);
 
CREATE TABLE students_skills (
    student_id INT(11) UNSIGNED NOT NULL,
    skill_id INT(11) UNSIGNED NOT NULL,
    PRIMARY KEY(student_id, skill_id)
);
 
INSERT INTO students VALUES (0, 'John'), (0, 'Peter');
 
INSERT INTO skills VALUES (0, 'C'), (0, 'PHP'), (0, 'CSS'), (0, 'HTML'), (0, 'JavaScript'), (0, 'jQuery'), (0, 'Autodesk Maya'), (0, 'Android'), (0, 'C++'), (0, 'Arduino'), (0, 'ObjectiveC');
 
INSERT INTO students_skills VALUES (1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (1, 6), (1, 7), (2, 8), (2, 9), (2, 10), (2, 11);
 
SELECT STRAIGHT_JOIN
    st.name,
    GROUP_CONCAT(sk.name SEPARATOR ', ') AS skills
    FROM students st
    JOIN students_skills v ON st.id = v.student_id
    JOIN skills sk ON sk.id = v.skill_id
    WHERE v.skill_id IN (1, 8, 5)
    GROUP BY name;
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mysql> SELECT STRAIGHT_JOIN
    -> st.name,
    -> GROUP_CONCAT(sk.name SEPARATOR ', ') as skills /* <-- слепить названия скиллов через запятую */
    -> FROM students st
    -> JOIN students_skills v ON st.id = v.student_id
    -> JOIN skills sk ON sk.id = v.skill_id
    -> WHERE v.skill_id IN (1, 8, 5) /* <-- в скобках ID скиллов, по которым ищем студентов */
    -> GROUP BY name;
+-------+---------------+
| name  | skills        |
+-------+---------------+
| John  | C, JavaScript |
| Peter | Android       |
+-------+---------------+
2 rows in set (0.00 sec)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.04.2014, 23:49
Помогаю со студенческими работами здесь

Improve Core Data skills
Привет всем. Как-то так печально у меня складывался рабочий опыт, что с CoreData особо проектов и не было. А если и было (две штуки),...

skills Cisco CCNA Discovery
здравствуйте. есть задание https://docs.google.com/open?id=1pHQyjUoFd0HOldLSgDMIwl3W4CJnH96M305kATZmib96iqjYQWeVaul_XGnD по нему...

Сделать программу, с авторизацией Админа и Пользователя, Сделать галлерею, чтобы фотографии стояли плиткой
Админ должен менять , добавлять фотографии, и чтобы при добавлении, программа сама меняла название, и фото должны быть через базу данных...

Как сделать так, чтобы если выбрал одного пользователя была видна кнопка, а если другого пользователя не видна
Как сделать так, чтобы если выбрал одного пользователя была видна кнопка, а если другого пользователя не видна.

Поиск пользователя в AD
Понимаю, что подобных тем создано много, но ни одна мне не подошла. Делаю на форме компонент ADOConnection. В нем Provider=ADsDSOObject....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru