powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как организовать бд для вот такой задачи?
25 сообщений из 109, страница 4 из 5
Как организовать бд для вот такой задачи?
    #38703597
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrejk ,

Правила форума на SQL.RU (v1.0) , смотрите пример в рекомендациях
...
Рейтинг: 0 / 0
Как организовать бд для вот такой задачи?
    #38704626
Serzh007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cygapb-007 andrejk ,

Правила форума на SQL.RU (v1.0) , смотрите пример в рекомендациях

Пронумеруйте правила, чтобы точнее указывать)
...
Рейтинг: 0 / 0
Как организовать бд для вот такой задачи?
    #38704657
Serzh007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ещё раз всем спасибо, кто потрудился написать мне для примера код. Попыхтел и вот что получилось (за основу взял код Cygapb-007 (случайно, просто по очереди пытался все предложенные решения под себя переделать и этот первый подддался), но и код от tanglir тоже разбира, буду сравнивать, учиться короче):

tn (idn, n) — таблица наборов слов.
ts (ids, s) — таблица слов.
t_s (id_n, id_s) — таблица связей между наборами и словами.

$oporn_slova — строка слов, вводимых пользователем вначале для подбора по ним.
$kolichestvo_opornyx_slov — количество изначально введённых опорных слов.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
select ts.s, count(*)
from (
  select t_s.id_n
  from  ts
  join t_s on t_s.id_s = ts.ids
  where ts.s in ('" . $oporn_slova . "')
  group by t_s.id_n having count(/*distinct*/ t_s.id_s) = " . $kolichestvo_opornyx_slov . "
  ) g
join t_s on t_s.id_n = g.id_n
join ts on ts.ids = t_s.id_s
group by t_s.id_s
order by count(*) desc, ts.s
;



Но у меня всё равно остались вопросы, потому, что переделать код под себя я пока смог без полного просветления, только с какой-то внутренней чуйкой. Ещё буду со всеми предложенными вариантами через ДЖОИНЫ разбираться.

Вот вопросы:

1 — не могу понять, в каком порядке БД выполняет код. Подставьте, пжлста, цыферки, что за чем выполняется.
2 — я так понял, сдесь вложенность ДЖОИНОВ?
3 — что изменит раскомментированный /*distinct*/?
4 — с псевдонимом g не понятно. Это псевдоним какой-то новой таблицы? Откуда потом появылось g.id_n?
5 — не понятно, count(*) ведь считает количество строк, как он посчитал количество слов по отдельности, чтоб потом по нему сортировать?

Вот как-то так. Спасибо.
...
Рейтинг: 0 / 0
Как организовать бд для вот такой задачи?
    #38704671
Serzh007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglir,

не могли бы вы повторить свой код, но уже с моими новыми короткими названиями?
...
Рейтинг: 0 / 0
Как организовать бд для вот такой задачи?
    #38704694
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
select ts.s, count(*)
from (
  select t_s.id_n
  from  ts -- 1.1, откуда берём данные
  join t_s on t_s.id_s = ts.ids -- 1.1, откуда берём данные
  where ts.s in ('" . $oporn_slova . "') -- 1.2, фильтр по словам
  group by t_s.id_n -- 1.3, группировка
  having count(/*distinct*/ t_s.id_s) = " . $kolichestvo_opornyx_slov . " 
-- 1.4 оставляем после группировки только такие id_n,
-- у которых количество id_s равно количеству нужных слов
  ) g -- 1
join t_s on t_s.id_n = g.id_n -- 1
join ts on ts.ids = t_s.id_s -- 1
group by t_s.id_s -- 2
order by count(*) desc, ts.s -- 3
;

как-то так

2. Не джойнов, а запросов. "Вложенных джойнов", насколько я понимаю, не может быть в принципе.
3. Это на случай, если у вас могут быть дублирующиеся записи в таблице связей. В случае, когда у вас есть только связи, без какой-либо доп. информации о них (т.е. в таблице связей есть только 2 поля: ид1 и ид2), повторов быть и так не должно, ну и дистинкт тогда не нужен.
4. g - псевдоним для результата подзапроса. Того, что выполняется в скобках.
5. На верхнем уровне выводятся 2 поля: первое - само слово, второе - количество повторов этого слова. Сортировка выполняется после группировки; количество повторов - обычное поле результата, по нему спокойно можно сортировать.

Почитайте хотя бы Грабера, что ли. Для понимания этого запроса будет имхо вполне достаточно.
...
Рейтинг: 0 / 0
Как организовать бд для вот такой задачи?
    #38704698
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Обнаружил косяк. Не то чтобы он на что-то повлиял, id_s всё-так первичный ключ, но лучше всё-таки сделать так
Код: sql
1.
2.
3.
4.
select ts.s, count(*)
<...>
group by ts.s
<...>

Это мускль добрый, а другие сервера такой запрос выполнять откажутся.
...
Рейтинг: 0 / 0
Как организовать бд для вот такой задачи?
    #38704730
Serzh007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglirОбнаружил косяк. Не то чтобы он на что-то повлиял, id_s всё-так первичный ключ, но лучше всё-таки сделать так
Код: sql
1.
2.
3.
4.
select ts.s, count(*)
<...>
group by ts.s
<...>

Это мускль добрый, а другие сервера такой запрос выполнять откажутся.

1 — Там два места группировки, в каком поменять? И почему откажутся, какая тут тонкость?

2 — Откуда потом появилось g.id_n? Что из себя представляет g? Таблицу с полями? Я та понимаю, что виртуальную, временную?
...
Рейтинг: 0 / 0
Как организовать бд для вот такой задачи?
    #38704735
Serzh007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglirОбнаружил косяк. Не то чтобы он на что-то повлиял, id_s всё-так первичный ключ, но лучше всё-таки сделать так
Код: sql
1.
2.
3.
4.
select ts.s, count(*)
<...>
group by ts.s
<...>

Это мускль добрый, а другие сервера такой запрос выполнять откажутся.

Косяк этот в примере от 007 или в вашем?
...
Рейтинг: 0 / 0
Как организовать бд для вот такой задачи?
    #38704748
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrejk,

в вашем
менять последний групбай
почему - см. здесь 13173672
...
Рейтинг: 0 / 0
Как организовать бд для вот такой задачи?
    #38704781
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tanglirОбнаружил косяк. Не то чтобы он на что-то повлиял, id_s всё-так первичный ключ, но лучше всё-таки сделать так
Код: sql
1.
2.
3.
4.
select ts.s, count(*)
<...>
group by ts.s
<...>

Это мускль добрый, а другие сервера такой запрос выполнять откажутся.Не то чтобы косяк - форум по MySQL, поэтому другие сервера как бы до лампочки. То же замечание, буде возникнет, относится к SUM(a=1) вместо SUM(case when a=1 then 1 else 0 end)

Ваша же замена может быть не идентичной, правильнее так:
select ts.s ... group by ts.id,ts.s
...
Рейтинг: 0 / 0
Как организовать бд для вот такой задачи?
    #38704800
Serzh007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglir,

Код: sql
1.
2.
3.
4.
5.
6.
7.
потому что напишите-ка результат этого запроса
select a,b,sum(c) from table group by a
 на таких данных
a	b	c
1	1	1
1	2	2
2	2	3



Здесь есть несоответствие в количестве выводимых строк в столбце «с» (одна строка, в которой сумма) и строк в других столбцах (по три в каждом)? Я правильно понял этот пример?
...
Рейтинг: 0 / 0
Как организовать бд для вот такой задачи?
    #38704810
Serzh007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Имел ввиду до группировки.
...
Рейтинг: 0 / 0
Как организовать бд для вот такой задачи?
    #38704822
Serzh007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cygapb-007group by ts.id,ts.s

Подставил это и выдало ошибку. Может я чё не так… Если просто подставить group by ts.s, то не выдаёт ошибок.
...
Рейтинг: 0 / 0
Как организовать бд для вот такой задачи?
    #38704882
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrejkCygapb-007group by ts.id,ts.s

Подставил это и выдало ошибку. Может я чё не так… Если просто подставить group by ts.s, то не выдаёт ошибок.
конкретно в вашем примере -
Код: sql
1.
group by t_s.id_s, ts.s
...
Рейтинг: 0 / 0
Как организовать бд для вот такой задачи?
    #38704908
Serzh007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, но можете хотябы в двух словал пояснить, всё же, в чём особенность?
...
Рейтинг: 0 / 0
Как организовать бд для вот такой задачи?
    #38705026
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrejkСпасибо, но можете хотябы в двух словал пояснить, всё же, в чём особенность?
если я правильно понял вопрос, то я имел в виду, что для select id,s,sum(val) from idsval111212224 group by id даст совсем не то же, что и group by s
правда, group by id,s тоже даст другой результат, так что может я и не по делу выступил...


Особенность в том, что MySQL позволяет, в отличие от других СУБД, не перечислять все неагрегатные поля в списке группировки.
При этом предполагается, что все такие поля содержат одно и то же значение для всех строк группы, поэтому неважно, из какой конкретно строки их можно включить в результат.

Большой минус такого подхода - излишняя доверчивость сервера к разумению автора запроса (проверка на наличие различных значений не делается никогда), из-за чего при наличии различных значений в не агрегатных и не группируемых полях может привести к различным (не детерминированным) результатам запроса.
...
Рейтинг: 0 / 0
Как организовать бд для вот такой задачи?
    #38705112
Serzh007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не нашёл, что такое агрегатные поля, только про функции пищут. Что это за поля?
...
Рейтинг: 0 / 0
Как организовать бд для вот такой задачи?
    #38705118
Serzh007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglir,

«Почитайте хотя бы Грабера, что ли. Для понимания этого запроса будет имхо вполне достаточно.»

Не укажете название книжечки, если она на русском?
...
Рейтинг: 0 / 0
Как организовать бд для вот такой задачи?
    #38705144
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Товарищи, похоже, он нас троллит.
https://www.google.ru/search?q=грабер sql
Первая(!) же ссылка - http://www.sql.ru/docs/sql/u_sql/
На русском! И даже качать не надо, *****, не то что покупать - открывай и читай!
...
Рейтинг: 0 / 0
Как организовать бд для вот такой задачи?
    #38705145
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrejkНе нашёл, что такое агрегатные поля, только про функции пищут. Что это за поля?
select id,s,sum(val) from tab group by id
id, s - поля таблицы, причем id входит в группировку (вроде бы можно назвать его агрегируемым), а s - не входит
sum(val) - агрегатная функция

Так вот, все СУБД требуют (и это правильно), чтобы в группировке были перечислены все поля из списка запроса, не входящие в агрегатные функции (т.е. как ID, так и S: group by id,s ).

Особенностью MySQL является то, что это требование по умолчанию отключено. При этом MySQL считает, что для каждого значения ID в выборке присутствует только одно значение S.

Типичная ошибка - нарушение этого предположения. В этом случае в итоговую выборку попадает одно из значений S, причем предсказать, какое именно (первое, последнее, промежуточное) - заранее невозможно.
Код: sql
1.
2.
3.
4.
5.
6.
7.
select id, s, sum(val)
from(
  select 2 id, 1 s, 1 val union all
  select 2, 2, 2 union all
  select 2, 3, 4
  ) s
group by id

непредсказуемо вернет либо (2,1,7), либо (2,2,7), либо (2,3,7)
...
Рейтинг: 0 / 0
Как организовать бд для вот такой задачи?
    #38705163
Serzh007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglirТоварищи, похоже, он нас троллит.
https://www.google.ru/search?q=грабер sql
Первая(!) же ссылка - http://www.sql.ru/docs/sql/u_sql/
На русском! И даже качать не надо, *****, не то что покупать - открывай и читай!

нет, похоже, что я уже закипаю — http://yandex.by/yandsearch?text=граббер mysql&lr=155 )))
...
Рейтинг: 0 / 0
Как организовать бд для вот такой задачи?
    #38705177
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrejk,

потому что книга Грабера - она, *****, не про МАЙэскуэль, она про ВООБЩЕ эскуэль. Про стандарт. И про суть.
...
Рейтинг: 0 / 0
Как организовать бд для вот такой задачи?
    #38705180
Serzh007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А это результат моего труда и вашей помощи, чтобы не думали, что я троль — http://slova.andrej.by/
И это я почти с нуля за неделю сделал. А вы с нуля через какое время написали действующий, пусть и крошечный, пусть и для себя, но сервисик?

(Да, я ТРОЛИЩЕ — и протролил и прорекламил)
...
Рейтинг: 0 / 0
Как организовать бд для вот такой задачи?
    #38705196
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrejk, вводим "13';select 1 from dual;'", на следующей странице получаем "Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in /home/webart/www/slova.andrej.by/index_2.php on line 77".
Ну и смысла я не понял - "собрать", потом "подобрать"... что оно делает?
...
Рейтинг: 0 / 0
Как организовать бд для вот такой задачи?
    #38705211
Serzh007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здесь ещё нет проверки и очистки введённых данных.
Что делает? Решает мои узкоспециализированные задачи) Чтобы не придумывать каждый раз слова, которые уже придумал, а видеть их перед собой и просто ставить птички.
...
Рейтинг: 0 / 0
25 сообщений из 109, страница 4 из 5
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как организовать бд для вот такой задачи?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]