<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=433823&amp;view=findpost&amp;p=3888984</guid>
        <pubDate>Sun, 02 Apr 2023 12:53:22 +0000</pubDate>
        <title>Поиск напарников по недостающим навыкам и наоборот.</title>
        <link>https://forum.sources.ru/index.php?showtopic=433823&amp;view=findpost&amp;p=3888984</link>
        <description><![CDATA[Tishaishii: Блин. Сколько всего понаписано. И ни кто ничего не решает. <br>
Так и не понял. Недостающие навыки или по существующим навыкам? <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2023-04-02T15:57:56+03:00">02.04.23, 12:57</time></span></span><br>
Если записей в таблицах &quot;не много&quot;, то подойдёт `group_concat` + `group_by`.<br>
Если записей много, то подойдёт первый вариант + временные таблицы. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2023-04-02T13:04:55+00:00">02.04.23, 13:04</time></span></span><br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">CREATE TABLE `user`(</div><div class="code_line">&nbsp;&nbsp; &nbsp;`id` BIGINT UNSIGNED NOT null AUTO_INCREMENT COMMENT &#39;идентификатор&#39; ,</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; PRIMARY KEY( `id` )</div><div class="code_line">) COMMENT &#39;пользователь&#39; ;</div><div class="code_line">&nbsp;</div><div class="code_line">CREATE TABLE `skill`(</div><div class="code_line">&nbsp;&nbsp; &nbsp;`id` BIGINT UNSIGNED NOT null AUTO_INCREMENT COMMENT &#39;идентификатор&#39; ,</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; PRIMARY KEY( `id` )</div><div class="code_line">) COMMENT &#39;навык&#39; ;</div><div class="code_line">&nbsp;</div><div class="code_line">CREATE TABLE `user_skill`(</div><div class="code_line">&nbsp;&nbsp; &nbsp;`id_user` BIGINT UNSIGNED NOT null AUTO_INCREMENT COMMENT &#39;идентификатор пользователя&#39; ,</div><div class="code_line">&nbsp;&nbsp; &nbsp;`id_skill` BIGINT UNSIGNED NOT null AUTO_INCREMENT COMMENT &#39;идентификатор навыка&#39; ,</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; PRIMARY KEY( `id_user` , `id_skill` )</div><div class="code_line">) COMMENT &#39;пользователь-навык&#39; ;</div><div class="code_line">&nbsp;</div><div class="code_line">-- собственно, запрос:</div><div class="code_line">&nbsp;</div><div class="code_line">SELECT</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;group_concat( DISTINCT `t1`.`id_user` ORDER BY 1 ASC ) AS `id_users` ,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;`t1`.`id_skills`</div><div class="code_line">FROM</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;(</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SELECT</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; `us1`.`id_user` ,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;group_concat( DISTINCT `us1`.`id_skill` ORDER BY 1 ASC ) AS `id_skills`</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; FROM</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;`user_skill` AS `us1`</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; GROUP BY</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;1</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; ) AS `t1`</div><div class="code_line">GROUP BY</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; 2 ;</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script> <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2023-04-02T13:05:48+00:00">02.04.23, 13:05</time></span></span><br>
Ещё септолетто  поможет. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2023-04-02T13:38:02+00:00">02.04.23, 13:38</time></span></span><br>
Ещё па-ра-це-то-мол:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">SELECT</div><div class="code_line">&nbsp;&nbsp; &nbsp;`t1`.`id_skill` ,</div><div class="code_line">&nbsp;&nbsp; &nbsp;`t1`.`skills` ,</div><div class="code_line">&nbsp;&nbsp; &nbsp;group_concat( DISTINCT `t1`. `id_user` ) AS `id_users`</div><div class="code_line">FROM</div><div class="code_line">&nbsp;&nbsp; &nbsp;(</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;SELECT</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;group_concat( DISTINCT `us1`.`id_skill` ORDER BY 1 ASC ) AS `skills` ,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;`uns1`.`id_user` ,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;`uns1`.`id_skill`</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;FROM</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;`user` AS `u1`</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;INNER JOIN `user_skill` AS `us1` ON</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;( `u1`.`id` = `us1`.`id_user` )</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;LEFT OUTER JOIN `needed_skill` AS `uns1` ON</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;( `us1`.`id_skill` = `uns1`.`id_skill` )</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;WHERE</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;( `uns1`.`id_skill` IS null )</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;GROUP BY</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;1 , 2</div><div class="code_line">&nbsp;&nbsp; &nbsp;) AS `t1`</div><div class="code_line">GROUP BY</div><div class="code_line">&nbsp;&nbsp; &nbsp;1 , 2 ;</div></ol></div></div></div></div>]]></description>
        <author>Tishaishii</author>
        <category>Базы данных: SQL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=433823&amp;view=findpost&amp;p=3888610</guid>
        <pubDate>Sat, 25 Mar 2023 20:01:41 +0000</pubDate>
        <title>Поиск напарников по недостающим навыкам и наоборот.</title>
        <link>https://forum.sources.ru/index.php?showtopic=433823&amp;view=findpost&amp;p=3888610</link>
        <description><![CDATA[Akina: <strong class='tag-b'>Majestio</strong><br>
Сорри, я почему-то подумал, что именно ты автор вопроса.]]></description>
        <author>Akina</author>
        <category>Базы данных: SQL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=433823&amp;view=findpost&amp;p=3888598</guid>
        <pubDate>Sat, 25 Mar 2023 16:14:37 +0000</pubDate>
        <title>Поиск напарников по недостающим навыкам и наоборот.</title>
        <link>https://forum.sources.ru/index.php?showtopic=433823&amp;view=findpost&amp;p=3888598</link>
        <description><![CDATA[Majestio: <strong class='tag-b'>Akina</strong>, не злись :) Все в рамках обсуждения. На счет &quot;дайте материалы&quot; - дай немножко времени, все будет :)]]></description>
        <author>Majestio</author>
        <category>Базы данных: SQL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=433823&amp;view=findpost&amp;p=3888597</guid>
        <pubDate>Sat, 25 Mar 2023 10:47:25 +0000</pubDate>
        <title>Поиск напарников по недостающим навыкам и наоборот.</title>
        <link>https://forum.sources.ru/index.php?showtopic=433823&amp;view=findpost&amp;p=3888597</link>
        <description><![CDATA[Akina: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=433823&view=findpost&p=3888596'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Majestio &#064; <time class="tag-quote__quoted-time" datetime="2023-03-25T09:41:36+00:00">25.03.23, 09:41</time></span><div class='quote '>Жестоко заданные CASE и WHEN не решают вопрос универсально.</div></div><br>
Во-первых, в моём запросе никаких CASE нет. <br>
Во-вторых, как я сказал, запрос должен сравнивать не с количеством скиллов вообще, а с количеством скиллов в запросе - то есть убеждаться, что каждое условие запроса выполняется.<br>
В третьих, для уж совсем универсальности, с такими дикими запросами, можно от схемы min_skill-max_skill перейти на схему ckill_set, и переданный набор требований по уровню скилла описывать в сериализованном виде (да хоть бы и в CSV).<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=433823&view=findpost&p=3888596'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Majestio &#064; <time class="tag-quote__quoted-time" datetime="2023-03-25T09:41:36+00:00">25.03.23, 09:41</time></span><div class='quote '>Я повторюсь: решите мой ранее заданный вопрос. А потом в рамках неопределенного заранее набора скилов.<br>
</div></div><br>
Дайте то, с чем можно работать. Сформулируйте задачу полностью и предоставьте все необходимые для её решения материалы (fiddle с исходными данными, точную формулировку запроса, эталонный ответ, подробные пояснения).]]></description>
        <author>Akina</author>
        <category>Базы данных: SQL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=433823&amp;view=findpost&amp;p=3888596</guid>
        <pubDate>Sat, 25 Mar 2023 09:41:36 +0000</pubDate>
        <title>Поиск напарников по недостающим навыкам и наоборот.</title>
        <link>https://forum.sources.ru/index.php?showtopic=433823&amp;view=findpost&amp;p=3888596</link>
        <description><![CDATA[Majestio: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=433823&view=findpost&p=3888574'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Akina &#064; <time class="tag-quote__quoted-time" datetime="2023-03-24T12:09:47+00:00">24.03.23, 12:09</time></span><div class='quote '>Очевидно, что для не заданных скиллов просто дефолтно задаётся любое значение - от 1 до 5.</div></div><br>
Не в этом вопрос. Вопрос в том, что количество скилов - произвольно. Тут засада. Жестоко заданные CASE и WHEN не решают вопрос универсально. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2023-03-25T09:43:01+00:00">25.03.23, 09:43</time></span></span><br>
Я повторюсь: решите мой ранее заданный вопрос. А потом в рамках неопределенного заранее набора скилов.]]></description>
        <author>Majestio</author>
        <category>Базы данных: SQL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=433823&amp;view=findpost&amp;p=3888591</guid>
        <pubDate>Fri, 24 Mar 2023 17:15:14 +0000</pubDate>
        <title>Поиск напарников по недостающим навыкам и наоборот.</title>
        <link>https://forum.sources.ru/index.php?showtopic=433823&amp;view=findpost&amp;p=3888591</link>
        <description><![CDATA[Akina: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=433823&view=findpost&p=3888583'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>RedLight &#064; <time class="tag-quote__quoted-time" datetime="2023-03-24T13:13:36+00:00">24.03.23, 13:13</time></span><div class='quote '>вообще я подразумевал набор &quot;1 или 5&quot; для Laravel</div></div><br>
С практической точки зрения это проверка типа &quot;А рельсу твоя бензопила распилит?&quot;. Ну не могу я придумать реального случая, когда к скиллу работника предъявлялись бы требования из разряда &quot;всё или ничего&quot; - тем более с учётом изрядной субъективности этой оценки. Хотя я всё равно не вижу проблемы - и даже в том, чтобы реализовать подобное требование.]]></description>
        <author>Akina</author>
        <category>Базы данных: SQL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=433823&amp;view=findpost&amp;p=3888583</guid>
        <pubDate>Fri, 24 Mar 2023 13:13:36 +0000</pubDate>
        <title>Поиск напарников по недостающим навыкам и наоборот.</title>
        <link>https://forum.sources.ru/index.php?showtopic=433823&amp;view=findpost&amp;p=3888583</link>
        <description><![CDATA[RedLight: <strong class='tag-b'>Akina</strong>, вообще я подразумевал набор &quot;1 или 5&quot; для Laravel, а не интервал &quot;от 1 до 5&quot;, но с интервалами тоже полезно, это у меня следующая задача.<br>
:crazy:<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=433823&view=findpost&p=3888568'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Majestio &#064; <time class="tag-quote__quoted-time" datetime="2023-03-24T10:25:35+00:00">24.03.23, 10:25</time></span><div class='quote '>2) не делать доп. таблицу, а добавить поле в user2skill, которое будет признаком &quot;скилл собственный или который требуется&quot;</div></div>Видимо надо столбец `have` таблицы `users` в отдельную таблицу перенести.<br>
:scratch:]]></description>
        <author>RedLight</author>
        <category>Базы данных: SQL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=433823&amp;view=findpost&amp;p=3888574</guid>
        <pubDate>Fri, 24 Mar 2023 12:09:47 +0000</pubDate>
        <title>Поиск напарников по недостающим навыкам и наоборот.</title>
        <link>https://forum.sources.ru/index.php?showtopic=433823&amp;view=findpost&amp;p=3888574</link>
        <description><![CDATA[Akina: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=433823&view=findpost&p=3888572'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Majestio &#064; <time class="tag-quote__quoted-time" datetime="2023-03-24T11:13:24+00:00">24.03.23, 11:13</time></span><div class='quote '>а вот для произвольного - в MySQL я пока не знаю как.</div></div><br>
Очевидно, что для не заданных скиллов просто дефолтно задаётся любое значение - от 1 до 5. То есть <strong class='tag-b'>Javascript=5 или PHP&gt;=4</strong> разворачивается в <strong class='tag-b'>PHP = 4-5, Laravel = 1-5, JavaScript = 5-5, Angular = 1-5, HTML = 1-5</strong>.<br>
<br>
Либо в запрос добавляется условие, что исследуются только заданные скиллы (<strong class='tag-b'><span class="tag-color tag-color-named" data-value="blue" style="color: blue">WHERE .. AND skill_id IN (1,3)</span></strong>) и корректируется количество в HAVING.<br>
<br>
В общем, про фантазию я уже говорил..]]></description>
        <author>Akina</author>
        <category>Базы данных: SQL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=433823&amp;view=findpost&amp;p=3888572</guid>
        <pubDate>Fri, 24 Mar 2023 11:13:24 +0000</pubDate>
        <title>Поиск напарников по недостающим навыкам и наоборот.</title>
        <link>https://forum.sources.ru/index.php?showtopic=433823&amp;view=findpost&amp;p=3888572</link>
        <description><![CDATA[Majestio: Амигос, вся эта затея, скажем так, разбивается при совсем небольшом усложнении требований по поиску.<br><br>Пример: <br><br>найти напарника, у которого PHP=3 и Laravel=3 или Javascript=5 или PHP&gt;=4<br><br>Я вижу пока один выход - развернуть строки в столбцы (pivot) и по ним строить сложные условия. <br>Для фиксированного количества разворачиваемых столбцов скилов - вроде не сложно, а вот для произвольного - в MySQL я пока не знаю как.]]></description>
        <author>Majestio</author>
        <category>Базы данных: SQL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=433823&amp;view=findpost&amp;p=3888569</guid>
        <pubDate>Fri, 24 Mar 2023 10:41:12 +0000</pubDate>
        <title>Поиск напарников по недостающим навыкам и наоборот.</title>
        <link>https://forum.sources.ru/index.php?showtopic=433823&amp;view=findpost&amp;p=3888569</link>
        <description><![CDATA[Akina: Возможная реализация:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">CREATE TABLE user (user_id INT AUTO_INCREMENT PRIMARY KEY, user_name VARCHAR(255));</div><div class="code_line">&nbsp;</div><div class="code_line">CREATE TABLE skill (skill_id INT AUTO_INCREMENT PRIMARY KEY, skill_name VARCHAR(255));</div><div class="code_line">&nbsp;</div><div class="code_line">CREATE TABLE user_skill (</div><div class="code_line">&nbsp;&nbsp;user_id INT NOT NULL,</div><div class="code_line">&nbsp;&nbsp;skill_id INT NOT NULL, </div><div class="code_line">&nbsp;&nbsp;PRIMARY KEY (user_id, skill_id),</div><div class="code_line">&nbsp;&nbsp;FOREIGN KEY (user_id) REFERENCES user (user_id),</div><div class="code_line">&nbsp;&nbsp;FOREIGN KEY (skill_id) REFERENCES skill (skill_id),</div><div class="code_line">&nbsp;&nbsp;grade TINYINT NOT NULL,</div><div class="code_line">&nbsp;&nbsp;CHECK (grade BETWEEN 1 AND 5)</div><div class="code_line">&nbsp;&nbsp;);</div><div class="code_line">&nbsp;</div><div class="code_line">CREATE TABLE criteria (</div><div class="code_line">&nbsp;&nbsp;user_id INT NOT NULL,</div><div class="code_line">&nbsp;&nbsp;FOREIGN KEY (user_id) REFERENCES user (user_id),</div><div class="code_line">&nbsp;&nbsp;skill_id INT NOT NULL, </div><div class="code_line">&nbsp;&nbsp;FOREIGN KEY (skill_id) REFERENCES skill (skill_id),</div><div class="code_line">&nbsp;&nbsp;min_grade TINYINT NOT NULL,</div><div class="code_line">&nbsp;&nbsp;max_grade TINYINT NOT NULL,</div><div class="code_line">&nbsp;&nbsp;CHECK (min_grade &#60;= max_grade),</div><div class="code_line">&nbsp;&nbsp;CHECK (min_grade &#62;= 1),</div><div class="code_line">&nbsp;&nbsp;CHECK (max_grade &#60;= 5)</div><div class="code_line">&nbsp;&nbsp;);</div></ol></div></div></div></div><br>
<br>
Запрос на получение партнёров, соответствующих всем критериям:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">SELECT user.user_name</div><div class="code_line">FROM user_skill</div><div class="code_line">JOIN user USING (user_id)</div><div class="code_line">JOIN criteria USING (skill_id)</div><div class="code_line">WHERE user_skill.grade BETWEEN criteria.min_grade AND criteria.max_grade</div><div class="code_line">&nbsp;&nbsp;AND user_skill.user_id &#60;&#62; criteria.user_id</div><div class="code_line">GROUP BY user_skill.user_id</div><div class="code_line">HAVING COUNT(*) = 5;</div></ol></div></div></div></div><br>
<br>
<a class='tag-url' href='https://dbfiddle.uk/VvAbyi0A' target='_blank'>DEMO fiddle</a><br>
<br>
В запросе жёстко забито именно 5 грейдов. По-хорошему, надо, конечно, посчитать COUNT записей в таблице скиллов в подзапросе.<br>
<br>
В принципе подобная схема вполне допускает различные расширения. Например, в таблицу критериев можно ввести весовые коэффициенты скиллов и отбирать тех партнёров, которые показали требуемый суммарный уровень скиллов... в общем, всё упирается исключительно в фантазию разработчика.]]></description>
        <author>Akina</author>
        <category>Базы данных: SQL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=433823&amp;view=findpost&amp;p=3888568</guid>
        <pubDate>Fri, 24 Mar 2023 10:25:35 +0000</pubDate>
        <title>Поиск напарников по недостающим навыкам и наоборот.</title>
        <link>https://forum.sources.ru/index.php?showtopic=433823&amp;view=findpost&amp;p=3888568</link>
        <description><![CDATA[Majestio: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=433823&view=findpost&p=3888564'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>RedLight &#064; <time class="tag-quote__quoted-time" datetime="2023-03-24T08:32:38+00:00">24.03.23, 08:32</time></span><div class='quote '>Majestio, в такой таблице user2skill навыки не разделяются на собственные и требуемые.</div></div><br>
В данной таблице - только собственные. Если нужны еще и требуемые, есть два варианта: <br>
1) сделать еще такую же таблицу для требуемых <br>
2) не делать доп. таблицу, а добавить поле в user2skill, которое будет признаком &quot;скилл собственный или который требуется&quot;]]></description>
        <author>Majestio</author>
        <category>Базы данных: SQL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=433823&amp;view=findpost&amp;p=3888564</guid>
        <pubDate>Fri, 24 Mar 2023 08:32:38 +0000</pubDate>
        <title>Поиск напарников по недостающим навыкам и наоборот.</title>
        <link>https://forum.sources.ru/index.php?showtopic=433823&amp;view=findpost&amp;p=3888564</link>
        <description><![CDATA[RedLight: <strong class='tag-b'>Majestio</strong>, в такой таблице user2skill навыки не разделяются на собственные и требуемые.<br>
:-?]]></description>
        <author>RedLight</author>
        <category>Базы данных: SQL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=433823&amp;view=findpost&amp;p=3888539</guid>
        <pubDate>Thu, 23 Mar 2023 16:17:37 +0000</pubDate>
        <title>Поиск напарников по недостающим навыкам и наоборот.</title>
        <link>https://forum.sources.ru/index.php?showtopic=433823&amp;view=findpost&amp;p=3888539</link>
        <description><![CDATA[Majestio: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=433823&view=findpost&p=3888447'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>RedLight &#064; <time class="tag-quote__quoted-time" datetime="2023-03-22T12:08:23+00:00">22.03.23, 12:08</time></span><div class='quote '>Какие таблицы создать и как поиск организовать в MySQL или где бы почитать ближе к теме?</div></div><br>
Оптимальный вариант будет - три таблицы:<br>
<ul class="tag-list"><li><strong class='tag-b'>users</strong> (id, name)</li><li><strong class='tag-b'>skills</strong> (id, name)</li><li><strong class='tag-b'>user2skill</strong> (user_id, skill_id, level)</li></ul>Третьей таблицей ты связываешь пользователя с навыком, при связывании указываешь численный уровень. Компактный вариант и ничего лишнего.<br>
Запросы на поиск по любым критериям делаются простейшими соединениями (joins).]]></description>
        <author>Majestio</author>
        <category>Базы данных: SQL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=433823&amp;view=findpost&amp;p=3888528</guid>
        <pubDate>Thu, 23 Mar 2023 12:14:24 +0000</pubDate>
        <title>Поиск напарников по недостающим навыкам и наоборот.</title>
        <link>https://forum.sources.ru/index.php?showtopic=433823&amp;view=findpost&amp;p=3888528</link>
        <description><![CDATA[RedLight: Прономеруем навыки и назовём оценки:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">// Массив названий навыков для полей формы.</div><div class="code_line">$skills = [1 =&#62; &#39;PHP&#39;, 2 =&#62; &#39;Laravel&#39;, 3 =&#62; &#39;JavaScript&#39;, 4 =&#62; &#39;Angular&#39;, 5 =&#62; &#39;HTML&#39;];</div><div class="code_line">// Массив названий уровней навыков для radio (собственный) и chekbox (искомые).</div><div class="code_line">$levels = [0 =&#62; &#39;unkown&#39;, 1 =&#62; &#39;fail&#39;, 2 =&#62; &#39;bad&#39;, 3 =&#62; &#39;normal&#39;, 4 =&#62; &#39;good&#39;, 5 =&#62; &#39;excellent&#39;];</div></ol></div></div></div></div><br>
Создадим таблицу пользователей со своими навыками и масками искомых навыков:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">-- Таблица пользователей.</div><div class="code_line">CREATE TABLE `users`</div><div class="code_line">(</div><div class="code_line">&nbsp;&nbsp; &nbsp;-- Идентификатор пользователя.</div><div class="code_line">&nbsp;&nbsp; &nbsp;`user` TINYINT UNSIGNED NOT NULL,</div><div class="code_line">&nbsp;&nbsp; &nbsp;-- Идентификатор навыка.</div><div class="code_line">&nbsp;&nbsp; &nbsp;`skill` TINYINT UNSIGNED NOT NULL,</div><div class="code_line">&nbsp;&nbsp; &nbsp;-- Собственный уровень навыка.</div><div class="code_line">&nbsp;&nbsp; &nbsp;`have` TINYINT UNSIGNED NOT NULL,</div><div class="code_line">&nbsp;&nbsp; &nbsp;-- Маска искомых навыков.</div><div class="code_line">&nbsp;&nbsp; &nbsp;`need` TINYINT UNSIGNED NOT NULL</div><div class="code_line">);</div></ol></div></div></div></div><br>
Добавим пользователя из примера и двух других, подходящего и не подходящего.<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">INSERT INTO `users`(`user`, `skill`, `have`, `need`) VALUES</div><div class="code_line">-- Пользователь из примера, но первый искомый навык только 1.</div><div class="code_line">(1, 1, 5, &nbsp;1), -- имеется 5, требуется 1</div><div class="code_line">(1, 2, 3, 17), -- имеется 3, требуется 1 или 5</div><div class="code_line">(1, 3, 1, 24), -- имеется 1, требуется 4 или 5</div><div class="code_line">(1, 4, 1, 24), -- имеется 1, требуется 4 или 5</div><div class="code_line">(1, 5, 2, &nbsp;0), -- имеется 2, требуется</div><div class="code_line">-- Взаимно подходящий пользователь.</div><div class="code_line">(2, 1, 1, 16), -- имеется 1, требуется 5</div><div class="code_line">(2, 2, 1, 14), -- имеется 1, требуется 2, 3 или 4</div><div class="code_line">(2, 3, 4, 17), -- имеется 4, требуется 1 или 5</div><div class="code_line">(2, 4, 5, &nbsp;1), -- имеется 5, требуется 1</div><div class="code_line">(2, 5, 2, &nbsp;0), -- имеется 2, не требуется</div><div class="code_line">-- Неподходящий пользователь - копия первого.</div><div class="code_line">(3, 1, 5, &nbsp;1), -- имеется 5, требуется 1</div><div class="code_line">(3, 2, 3, 17), -- имеется 3, требуется 1 или 5</div><div class="code_line">(3, 3, 1, 24), -- имеется 1, требуется 4 или 5</div><div class="code_line">(3, 4, 1, 24), -- имеется 1, требуется 4 или 5</div><div class="code_line">(3, 5, 0, &nbsp;0); -- не указан, требуется любой</div></ol></div></div></div></div><br>
Создадим таблицу масок искомых навыков:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">-- Таблица масок.</div><div class="code_line">CREATE TABLE `masks`</div><div class="code_line">(</div><div class="code_line">&nbsp;&nbsp; &nbsp;-- Номер маски.</div><div class="code_line">&nbsp;&nbsp; &nbsp;`mask` TINYINT UNSIGNED NOT NULL,</div><div class="code_line">&nbsp;&nbsp; &nbsp;-- Одно из значений маски.</div><div class="code_line">&nbsp;&nbsp; &nbsp;`item` TINYINT UNSIGNED NOT NULL</div><div class="code_line">);</div></ol></div></div></div></div><br>
Добавим используемые в примере маски.<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">INSERT INTO `masks`(`mask`, `item`) VALUES</div><div class="code_line">-- 0b00001 = &nbsp;1</div><div class="code_line">( 1, 1),</div><div class="code_line">-- 0b01110 = 14</div><div class="code_line">(14, 2),</div><div class="code_line">(14, 3),</div><div class="code_line">(14, 4),</div><div class="code_line">-- 0b10000 = 16</div><div class="code_line">(16, 5),</div><div class="code_line">-- 0b10001 = 17</div><div class="code_line">(17, 1),</div><div class="code_line">(17, 5),</div><div class="code_line">-- 0b11000 = 24</div><div class="code_line">(24, 4),</div><div class="code_line">(24, 5);</div></ol></div></div></div></div><br>
Если таким образом таблицы организовать то можно будет запрос поиска составить или так не бывает?<br>
Не будет ли такая конструкция очень медленной?<br>
Как составить запрос?<br>
:scratch:]]></description>
        <author>RedLight</author>
        <category>Базы данных: SQL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=433823&amp;view=findpost&amp;p=3888466</guid>
        <pubDate>Wed, 22 Mar 2023 14:27:58 +0000</pubDate>
        <title>Поиск напарников по недостающим навыкам и наоборот.</title>
        <link>https://forum.sources.ru/index.php?showtopic=433823&amp;view=findpost&amp;p=3888466</link>
        <description><![CDATA[Akina: Читать про фасетный поиск.<br>Структура - EAV, multicolumn (только для статического набора скиллов), SET datatype. Возможно, JSON, но тут есть сомнения..]]></description>
        <author>Akina</author>
        <category>Базы данных: SQL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=433823&amp;view=findpost&amp;p=3888447</guid>
        <pubDate>Wed, 22 Mar 2023 12:08:23 +0000</pubDate>
        <title>Поиск напарников по недостающим навыкам и наоборот.</title>
        <link>https://forum.sources.ru/index.php?showtopic=433823&amp;view=findpost&amp;p=3888447</link>
        <description><![CDATA[FateFlex: Требуется сделать поиск напарников.<br>Например будут навыки: PHP, Laravel, JavaScript, Angular, HTML.<br>Каждый навык может иметь пятибалльную оценку или 0 если не указан.<br>Например программист ищет напарника:<br>1. Сам о себе указывает: PHP = 5, Laravel = 3, JavaScript = 1, Angular = 1, HTML = 2.<br>2. Хочет найти напарника: PHP = 1, Laravel = 1|5, JavaScript = 4|5, Angular = 4|5, HTML = 0 (любой).<br>Какие таблицы создать и как поиск организовать в MySQL или где бы почитать ближе к теме?]]></description>
        <author>FateFlex</author>
        <category>Базы данных: SQL</category>
      </item>
	
      </channel>
      </rss>
	