Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Group_concat и лишние проблелы / 9 сообщений из 9, страница 1 из 1
24.02.2015, 00:31:06
    #38886658
ElenaTomsk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Group_concat и лишние проблелы
Здравствуйте!

Делаю обьединение и по умолчанию ставлю разделитель пробел. Получается вот так:

"Студент , заботливо подающий зачетку , особенно любим преподавателем . "

Каждое слово включая знаки препинания находится в отдельной строке и все это в кучу собирается. А как бы сделать, чтобы знаки препинания были как положено в русском языке - слитно с предыдущим словом и отдельно от следующего? Вот так:

"Студент, заботливо подающий зачетку, особенно любим преподавателем."
...
Рейтинг: 0 / 0
24.02.2015, 00:46:05
    #38886663
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Group_concat и лишние проблелы
А из каких данных строку собираете?

Пока единственное что приходит в голову - корректировать потом REPLACE-ом.
...
Рейтинг: 0 / 0
24.02.2015, 08:13:01
    #38886760
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Group_concat и лишние проблелы
miksoftА из каких данных строку собираете? перемножить все имеющиеся варианты слов - помогите, пожалуйста ! !!! же :)


Елена, тут 2 варианта:
1)как сказал миксофт, корректировать реплейсом (но для этого придётся либо хардкодить в корректирующий запрос всё содержимое таблицы punctuat либо собирать этот запрос на лету);
2) (я понимаю, что реализация уже 100 раз поменялось, но идея-то скорее всего осталась) вместо

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
group_concat(case id_wordtype
     when 1  then concat('verb',positionword,'.word')
     when 10 then concat('noun',positionword,'.word')
     when 3  then concat('punctuat',positionword,'.word')
     -- <...>
     when 14/*fixed-id*/ then concat('ifnull(fixed',positionword,'.word,"")')
     else '\'<unknown wordtype!>\''
     end
  order by positionword separator ', \' \' \r\n,'

делать так

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
group_concat(case id_wordtype
     when 1  then concat( ' \' \' ','verb',positionword,'.word')
     when 10 then concat( ' \' \' ','noun',positionword,'.word')
     when 3  then concat('punctuat',positionword,'.word',)
     -- <...>
     when 14/*fixed-id*/ then concat( ' \' \' ','ifnull(fixed',positionword,'.word,"")')
     else '\'<unknown wordtype!>\''
     end
  order by positionword separator ', \r\n,'

Простыми словами - вместо возложения работы по добавлению пробелов на кляузу "сепаратор" вписать их вручную где надо (а где не надо - не вписывать).
...
Рейтинг: 0 / 0
26.02.2015, 20:36:02
    #38890017
ElenaTomsk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Group_concat и лишние проблелы
tanglir,

Здравствуйте! Очень приятно, что вы меня помните. По-моему, вариант с replace более удобен. Конечно, вы правы, я уже почти все переделала. Очень упростила. Сделала так: все слова и пунктуацию в одну таблицу. Еще одну таблицу с группами возможных замен.

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

сейчас получается

Студент NULL
NULL Идет
NULL Бежит
NULL Скачет
NULL Ползет
NULL Прыгает
По NULL
NULL Дороге
NULL Тропинке

Умножение-то правильное, но как теперь из этого получить общий итог в виде предложений со всеми этими вариантами, пока не знаю. Начинаю городить процедуры, временные таблицы и чувствую, что не туда заносит, что можно проще как-то.

Может быть, вы сумеете мне помочь?
...
Рейтинг: 0 / 0
26.02.2015, 21:10:15
    #38890033
ElenaTomsk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Group_concat и лишние проблелы
ElenaTomsk,

получается так:
Код: sql
1.
2.
3.
tbl_word
id_mword int
mword varchar(128)


тут все слова во всех формах и каждое из них с уникальным id

Дальше я в отдельную таблицу tbl_groupdetail

Код: plsql
1.
2.
3.
Id_groupdetail int 
id_group int 
id_word 


И тогда получатся тут:

И заношу, скажем, такие слова:

Id_groupdetail id_group id_word
1 1 5
2 1 12
2 1 17

Это "бежит", "скачет", "идет"

А дальше совсем просто, как мне кажется:

Код: sql
1.
2.
3.
4.
5.
6.
tbl_detailtemplate: 

id_detailtemplate int
id_template int
id_word int  
id_group int  


И заполняю:


Код: sql
1.
2.
3.
id_detailtemplate id_template id_word               id_group 
1                            4              98                    Null
2                            4              NULL                  1



Получается, что там, где слова менять не надо, там id группы null, а id слова выбирается через left join
А там, где надо - там id group не null и тогда выбирается id_group и через него те слова, которые тут могут быть на замену.


Код: sql
1.
2.
3.
4.
5.
SELECT * FROM tbl_detailtemplate tt
LEFT JOIN tbl_word tw ON tt.id_group IS NULL AND tt.Id_Mword = tw.Id_Mword
LEFT JOIN tbl_groupdetail gd ON tt.Id_Mword IS NULL AND tt.Id_group = gd.Id_group 
LEFT JOIN tbl_word twg ON gd.Id_Mword = twg.Id_Mword 
ORDER BY tt.id_detailtemplate 



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

1 Студент бежит
2 Студент идет
3 Студент скачет

и это, конечно, самый просто еще вариант, всего строк в tbl_detailtemplate на один id_template может быть до 40, там и группы могут быть штук по 7. Чувствую, что все-таки можно одним запросом, но доказать не могу. А может, и не будет одним запросом быстро, а действительно надо как-то с временными таблицами.


Тут еще вот какая загвоздка: слова в предложении должны быть уникальными. Если же я в рамках одного темлейта указываю одну группу несколько раз, то:

Код: sql
1.
2.
3.
4.
5.
id_detailtemplate id_template id_word               id_group 
1                            4              98                    Null                 -- студент 
2                            4              NULL                  1                  -- группа действий, ходьба 
3                            4              189                  Null                 -- и
4                            4              NULL                  1                  -- группа действий, ходьба 



Может получиться так:

Студент идет и идет.
Студент бежит и бежит.
Студент скачет и скачет.

А надо, чтобы внутри одного предложения слова не повторялись, даже если они из одной группы:

Студент бежит и скачет
Студент бежит и идет
Студент идет и скачет
Студент идет и бежит
Студент скачет и идет
Студент скачет и бежит

Вот тут я думала, что надо отбирать слова в временную таблицу и при дальнейшей выборке каким-то циклом проверять, нет ли уже слова с таким id в этой временной таблице. Как правильно?
...
Рейтинг: 0 / 0
27.02.2015, 06:48:38
    #38890167
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Group_concat и лишние проблелы
ElenaTomsk, вечером почитаю, постараюсь вникнуть :)
...
Рейтинг: 0 / 0
28.02.2015, 14:26:29
    #38891323
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Group_concat и лишние проблелы
ElenaTomskКак этот запрос переделатьВозвращаясь к тому, с чего в тот раз начинали - если вы хотите получить конечный результат одним запросом, то в нём не может быть фиксированного количества джойнов. Т.к. каждая группа = перебор, а каждый перебор = отдельный джойн.
ElenaTomskМожет получиться так:

Студент идет и идет.
Студент бежит и бежит.
Студент скачет и скачетхмм... у меня получилось idid_templateid_mwordid_groupidmwordidid_groupid_mwordidmword1498\N98 студент \N\N\N\N\N24\N1\N\N311717 идёт 24\N1\N\N1155 бежит 24\N1\N\N211212 скачет 34189\N189 и \N\N\N\N\N44\N1\N\N211212 скачет 44\N1\N\N311717 идёт 44\N1\N\N1155 бежит Каким образом вы из этого собираете, к примеру, "студент идёт и идёт" - я не знаю, поэтому посоветовать ничего не могу.
...
Рейтинг: 0 / 0
01.03.2015, 17:48:56
    #38891805
ElenaTomsk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Group_concat и лишние проблелы
tanglir,

Тот запрос, который я привела, он нерабочий :(, это только пример.
Мне надо в итоге получить шесть предложений. Или больше, если в группе больше вариантов, чем "бежит, идет, скачет". Перемножить их все между собой, а основные слова не менять. "Студент" and "и" не меняются, а остальные должны меняться.

Вот так:
Студент идет и бежит.
Студент идет и скачет

Студент бежит и идет
Студент бежит и скачет

Студент скачет и бежит
Студент скачет и идет.

Вы предлагаете собирать запрос под это вручную, но у меня не хватает соображения, как это сделать. Я вижу только вариант с подзапрос:
Код: sql
1.
select verb from tbl_groupdetail where id_group = 1 limit 1 order by rand()  



на каждую строку, у которой id_group is not null. И вот если таких строк 4-5 и более, то вероятность, что order by rand() отсортирует слова в ранее уже встречавшемся варианте велика.

Т.е упрошая до максимума:


id_detailtemplate Id_group
1 1
2 Null
3 1
4 Null
5 1

далее join с tbl_detailgroup, в которой лежит три слова: "бежит, идет, скачет". И гарантии, что я не получу один и тот же вариант в позициях 1, 3, 5, например "скачет", "скачет", "скачет" нет. А такой скакун не нужен. :(


Как можно сделать, чтоб если бы уже отобрано в позиции 1, например, id_detailgroup 2 (бежит), то чтобы в 3 и 5 это уже не попадало?
Никак не вижу сама возмножности без перебора построчно временной таблицы. Идея такая, что отобрала id в какую-то временную таблицу, а дальше уже запрос:
Код: sql
1.
select verb from tbl_groupdetail where id_group = 1 limit 1 order by rand()  



превратиться в такое:

Код: sql
1.
2.
3.
select verb from tbl_groupdetail where id_group = 1 
and id_mword not in (select id_mword from tempTable)
limit 1 order by rand()  



Только какая-то кривая очень безобразия получается. Очень надеюсь, что есть другой путь.
...
Рейтинг: 0 / 0
01.03.2015, 23:18:51
    #38891934
ElenaTomsk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Group_concat и лишние проблелы
А вот еще появилась такая идея: посчитать, сколько раз конкретно используется группа через count, group by
и тогда брать запросом не limit 1, a limit числовхожденийэтойгруппы. Может, конечно, я опять невнятно объясняю, но кроме как здесь мне посоветоваться совсем не скем.
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Group_concat и лишние проблелы / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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