powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Все вопросы по MySQL "Cook Room"
25 сообщений из 25, страница 1 из 1
Все вопросы по MySQL "Cook Room"
    #33122936
Фотография Berkut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если у кого-то возникают вопросы с тем, что находится в MySQL "Cook Room" , то задавайте их в этой ветке. :)
...
Рейтинг: 0 / 0
Все вопросы по MySQL "Cook Room"
    #33122940
Фотография Berkut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Меня, например, интересуют следующие вопросы, которые хотелось бы увидеть в будущем в Cook Room :

 "как удалить дублирующиеся записи из таблицы, за исключением одной?" (удаление повторяющихся строк, кроме одной);

 "как сделать доступ к СУБД MySQL в локальной сети"

 решить раз и навсегда проблему с кодировками

 использование полнотекстового поиска

 проблемы с миграциями

 связь MySQL через ODBC с другими СУБД или внешними программи, например, такими как ErWin.

Кое-что уже можно написать, но нет пока на это времени. :)

Если у кого-нибудь есть какие мысли по этим и другим вопросам - кидайте сюда. Надеюсь, что это интересно для вас. :)
...
Рейтинг: 0 / 0
Все вопросы по MySQL "Cook Room"
    #33123248
Фотография Berkut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кандидат в MySQL "Cook Room" :

Задача: Требуется удалить дублирующиеся записи из таблицы так, чтобы остались только уникальные записи.

Решение: Одним из способов является добавление уникального индекса в таблицу с помощью ALTER TABLE, который удалит дубликаты в процессе построения (индекса).

Код: plaintext
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 t (   foo int not null)

insert into t (foo) values ( 1 ), ( 2 ), ( 3 ), ( 0 ), ( 1 ), ( 1 ), ( 0 ), ( 3 )

select * from t

 foo  
------
      1 
      2 
      3 
      0 
      1 
      1 
      0 
      3 

-- добавляем индекс (UNIQUE KEY) по полю foo
alter ignore table t add unique key(foo)
( 8  row(s) affected)

-- таблица t после операции ALTER TABLE
select * from t

 foo  
------
      0 
      1 
      2 
      3 

Примечание:

* Для использования оператора ALTER TABLE необходимы привилегии ALTER, INSERT и CREATE для данной таблицы.
* Использование опции IGNORE:
MySQL Manual
Опция IGNORE является расширением MySQL по отношению к ANSI SQL92. Она управляет работой ALTER TABLE при наличии дубликатов уникальных ключей в новой таблице. Если опция IGNORE не задана, то для данной копии процесс прерывается и происходит откат назад. Если IGNORE указывается, тогда для строк с дубликатами уникальных ключей только первая строка используется, а остальные удаляются.

* одно важное замечание по использованию данного метода: в том случае если у вас могут присутствовать NULL-значения, то следует использовать UNIQUE KEY, а не PRIMARY KEY. В первом случе UNIQUE KEY не будет удалять дубликаты с NULL-значениями ("UNIQUE indexes allow multiple NULL values").

Ваше мнение? :)
...
Рейтинг: 0 / 0
Все вопросы по MySQL "Cook Room"
    #33123338
Sarin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Между тем часто бывает нужно, чтоб остались только записи у которых уникальность определяется по двум полям. Пример: в моём нынешнем проекте есть таблица в которой отмечается когда сотрудник пришёл на работу.

Тоесть:
---------------------
man_id|date|
---------------------

Естественно, что не бывает так, что сотрудник два раза за день пришёл на работу. Как вычистить таблицу в этом случае?

Насчёт кандидата: тривиально и есть в мануале. Не стоит.

 "как сделать доступ к СУБД MySQL в локальной сети"
В чём трабл?
...
Рейтинг: 0 / 0
Все вопросы по MySQL "Cook Room"
    #33123352
Фотография Berkut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sarin
Естественно, что не бывает так, что сотрудник два раза за день пришёл на работу. Как вычистить таблицу в этом случае

В этом случае просто сделать Unique Key, по двум полям. Соответвественно,
Код: plaintext
1.
2.
alter ignore table your_table add unique key(man_id, date)
...
SarinНасчёт кандидата: тривиально и есть в мануале. Не стоит.
Чесно говоря, мне просто до этого не попадалось на глаза. :)
Sarin "как сделать доступ к СУБД MySQL в локальной сети"
В чём трабл?
Проблемы как таковой в принципе и нет... =) Чтобы нормально написать и четко надо время. Я сам раньше задавал этот вопрос, который периодически проскакивает на форуме. Собственно по этой причине и хотелось выложить описание в "раздел рецептов". :)

Что касается остальных вопросов, то имхо это наиболее часто задаваемые вопросы, которые тоже было бы неплохо рассмотреть.
...
Рейтинг: 0 / 0
Все вопросы по MySQL "Cook Room"
    #33123363
Sarin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Давай ФАКову ФАКово. А Кук рум пусть лучше будет для красивых и нужных решений. Так сказать посмаковать.
...
Рейтинг: 0 / 0
Все вопросы по MySQL "Cook Room"
    #33123444
Фотография Berkut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SarinДавай ФАКову ФАКово. А Кук рум пусть лучше будет для красивых и нужных решений. Так сказать посмаковать.
Согласен. Только некоторые вопросы, которые попадают под категорию ЧАВО, имхо все-таки лучше тоже рассмотреть, т.к. каждый раз народ по новой спрашивает и спрашивает. :) А таких вопросов на самом деле не так уж много.

Тем самым можно и себе жизнь облегчить, и другим.
...
Рейтинг: 0 / 0
Все вопросы по MySQL "Cook Room"
    #33123772
Sarin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Облегчай. Флаг те в руки. Они всё равно в форуме новую ветку всегда создают.
А вообще, может в кук рум всё интересное постить? Что нужно и что многие забывают. А чтоб вспомнить вопрос задают. А так человек будет знать, что это уже есть в кук руме.

Кстати, про твой последний пост там: не каждый запрос с вложенным можно переписать без вложенного. Если перепишет тот твой, то запость его там, пжалста.
...
Рейтинг: 0 / 0
Все вопросы по MySQL "Cook Room"
    #33123808
Фотография Berkut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SarinОблегчай. Флаг те в руки. Они всё равно в форуме новую ветку всегда создают.

SarinА вообще, может в кук рум всё интересное постить? Что нужно и что многие забывают. А чтоб вспомнить вопрос задают. А так человек будет знать, что это уже есть в кук руме.

Впрочем, я так и думал сначала. Главное народ заинтересовать! К тому же поиск на форуме иногда рулитт!!
ИМХО Кук рум - это сборник рецептов, как интересных, нужных, так и изящных решений, применяемых на практике.
SarinКстати, про твой последний пост там: не каждый запрос с вложенным можно переписать без вложенного. Если перепишет тот твой, то запость его там, пжалста.
Дык, да... не каждый можно переписать. В мане об этом и пишут.

P.S. Sarin, спасибо за поддержку! =)
...
Рейтинг: 0 / 0
Все вопросы по MySQL "Cook Room"
    #33123812
Sarin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да мне занятся нечем:) Плохо, что я в МуСКЛе плохо шарю. А тоб ещё и запросов хитрых накидал Вообще я половину работы, которую грамотный программист решает средствами СУБД взваливаю на клиента.
...
Рейтинг: 0 / 0
Все вопросы по MySQL "Cook Room"
    #33123992
Фотография Berkut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SarinДа мне занятся нечем:) Плохо, что я в МуСКЛе плохо шарю. А тоб ещё и запросов хитрых накидал Вообще я половину работы, которую грамотный программист решает средствами СУБД взваливаю на клиента.
Дык, кидай "задачи"... может кто знает как решить это средствами MySQL. :)
...
Рейтинг: 0 / 0
Все вопросы по MySQL "Cook Room"
    #33124296
Sarin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хорошо. Вот задача из моего проекта: Есть таблица с сотрудниками, есть с отпусками и есть с больничными. Надо объединить их. Казалось бы всё просто:
Код: plaintext
1.
2.
3.
4.
5.
SELECT sotrudniki.id, sotrudniki.sname, sotrudniki.name,
otpusk.begin_date, otpusk.end_date,
bolnichniy.begin_date, bolnichniy.end_date
WHERE sotrudniki.id = otpusk.man_id AND sotrudniki.id = bolnichniy.man_id
ORDER BY sotrudniki.id
sotrudniki.id - внешний ключ.
Зпарос выдаёт только тех сотрудников у которых есть и отпуск и больничный. Что неудевительно.
Переписываем запрос:
Код: plaintext
1.
2.
3.
4.
5.
SELECT sotrudniki.id, sotrudniki.sname, sotrudniki.name,
otpusk.begin_date, otpusk.end_date,
bolnichniy.begin_date, bolnichniy.end_date
WHERE sotrudniki.id = otpusk.man_id OR sotrudniki.id = bolnichniy.man_id
ORDER BY sotrudniki.id
Но результат тот-же.
...
Рейтинг: 0 / 0
Все вопросы по MySQL "Cook Room"
    #33124302
DocAl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что, например, про полнотекстовый поиск нужно писать, кроме как то, что он есть?
...
Рейтинг: 0 / 0
Все вопросы по MySQL "Cook Room"
    #33124319
Фотография Berkut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DocAlА что, например, про полнотекстовый поиск нужно писать, кроме как то, что он есть?
На самом деле я не знаю, потому что сам еще ни разу не юзал его. Просто хотелось обозначить проблему, т.к. ИМХО она все-таки на форуме существует, судя по постам.
Думаю, что, если кто сталкивался и хорошо понимает особенность проблемы, то кто-нить мог бы написать об этом.
...
Рейтинг: 0 / 0
Все вопросы по MySQL "Cook Room"
    #33124341
DocAl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так проблема и заключается только в том, что не все, кому эта тема на самом деле актуальна, о ней знают)
...
Рейтинг: 0 / 0
Все вопросы по MySQL "Cook Room"
    #33124447
trijin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SarinХорошо. Вот задача из моего проекта: Есть таблица с сотрудниками, есть с отпусками и есть с больничными. Надо объединить их. ...
SELECT sotrudniki.id, sotrudniki.sname, sotrudniki.name,
otpusk.begin_date, otpusk.end_date,
bolnichniy.begin_date, bolnichniy.end_date
WHERE sotrudniki.id = otpusk.man_id OR sotrudniki.id = bolnichniy.man_id
ORDER BY sotrudniki.id
[/src]Но результат тот-же.
что и понятно.
можно используя FROM .. LEFT OUTER JOIN .. могу предположить что должно быть что-то вроде:
Код: plaintext
1.
2.
3.
4.
5.
6.
SELECT s.id, s.sname, s.name,
o.begin_date, o.end_date,
b.begin_date, b.end_date
FROM (sotrudniki s LEFT OUTER JOIN otpusk o ON s.id = o.man_id) LEFT OUTER JOIN bolnichniy b ON s.id = b.man_id
WHERE o.begin_date!=NULL OR b.begin_date!=NULL
ORDER BY sotrudniki.id
или можно с помощью UNION Но за это я не возьмусь написать.
немного извеняюсь.. так как дееспособность запроса на практике не проверял. Возможно не прав.
...
Рейтинг: 0 / 0
Все вопросы по MySQL "Cook Room"
    #33124477
trijin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
прошу прощения ошибку все еж допустил...
WHERE делает проверку до стыковки. заменил на HAVING
Код: plaintext
1.
2.
3.
4.
5.
6.
SELECT s.id, s.sname, s.name,
o.begin_date, o.end_date,
b.begin_date, b.end_date
FROM (sotrudniki s LEFT OUTER JOIN otpusk o ON s.id = o.man_id) LEFT OUTER JOIN bolnichniy b ON s.id = b.man_id
HAVING o.begin_date!=NULL OR b.begin_date!=NULL
ORDER BY sotrudniki.id

--------------
P.S жалко нельзя редактировать.
...
Рейтинг: 0 / 0
Все вопросы по MySQL "Cook Room"
    #33124682
Sarin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно. Модеры этим часто занимаются.
...
Рейтинг: 0 / 0
Все вопросы по MySQL "Cook Room"
    #33124723
Фотография Berkut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Sarin

По поводу задачи.

А LEFT JOIN или что-нить в этом роде не помогает?
...
Рейтинг: 0 / 0
Все вопросы по MySQL "Cook Room"
    #33124952
Sarin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Berkut 2 Sarin

По поводу задачи.

А LEFT JOIN или что-нить в этом роде не помогает?
Смеятся будешь. Не пробовал

Я как обычно. Средствами клиента

Создал тип записи. В него прочитал. Потом друой запрос. Опять прочитал. Не так уж и медленно получилось:)
...
Рейтинг: 0 / 0
Все вопросы по MySQL "Cook Room"
    #33131639
Фотография Berkut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кандидат в MySQL Cook Room
Как сгенерировать список дат за месяц, которых нет в таблице?


Задача:
Требуется создать отчет, который будет определять дни месяца, которые не вошли в таблицу.
Допустим ваш БОСС, говорит вам: "Я хочу знать как там обстоят дела с продажами товаров за месяц? Определи пожалуйста те дни, в которые мы ничего не продали".

Итак Вы понимаете, что вы можете это проделать как-то вручную. Но вдруг так просят делать каждый месяц? Что тогда?

Решение: (пока что сырой вариант и требует доработки)
Код: plaintext
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.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
-- установливаем новый формат даты для удобства
set global date_format='%d.%m.%Y'

-- создаем новую табличку
create table t ( d date)

( 0  row(s) affected)
( 0  ms taken)

-- заливаем даты
insert into t (d) values (str_to_date('12.06.2005', '%d.%m.%Y'));
insert into t (d) values (str_to_date('13.06.2005', '%d.%m.%Y'));
insert into t (d) values (str_to_date('14.06.2005', '%d.%m.%Y'));
insert into t (d) values (str_to_date('20.06.2005', '%d.%m.%Y'));
insert into t (d) values (str_to_date('21.06.2005', '%d.%m.%Y'));

( 5  row(s) affected)

/*
   находим те дни, в которые были продажи за месяц
   ясно, что если у нас в таблице содержатся данные 
   по нескольким месяцам, то необходимо добавить условие where
   
   рассмотрим простейший случай:
*/

select date_format(d, '%d.%m.%Y') dates from t

dates     
----------
 12 . 06 . 2005 
 13 . 06 . 2005 
 14 . 06 . 2005 
 20 . 06 . 2005 
 21 . 06 . 2005 

/*
   теперь сгенерим "множество дней месяца"
   
   примечание: 31 - это последний день месяца, который можно определить с помощью MySQL
*/

select x1.ones+x2.tens mdays
from (
    select  0  ones union all
    select  1  ones union all
    select  2  ones union all
    select  3  ones union all
    select  4  ones union all
    select  5  ones union all
    select  6  ones union all
    select  7  ones union all
    select  8  ones union all
    select  9  ones) x1,
    (select  0  tens union all
    select  10  tens union all
    select  20  tens union all
    select  30  tens) x2
where x1.ones+x2.tens between  1  and  31 

-- в итоге получим числа
mdays
---------
         1 
         2 
...
        30 
        31 
	   
-- сохраним это множество во временной таблице
create temporary table t_1
as
select x1.ones+x2.tens mday
from (
    select  0  ones union all
    select  1  ones union all
    select  2  ones union all
    select  3  ones union all
    select  4  ones union all
    select  5  ones union all
    select  6  ones union all
    select  7  ones union all
    select  8  ones union all
    select  9  ones) x1,
    (select  0  tens union all
    select  10  tens union all
    select  20  tens union all
    select  30  tens) x2
where x1.ones+x2.tens between  1  and  31 

( 31  row(s) affected)

-- теперь все готово, чтобы создать отчет

select concat(t_1.mday, '.', Month('2005-06-00'), '.', YEAR('2005-06-00')) as dates
from t_1 left join t
on t_1.mday=DAYOFMONTH(t.d)
where t.d is null

dates    
---------
 1 . 6 . 2005  
 2 . 6 . 2005  
 3 . 6 . 2005  
 4 . 6 . 2005  
 5 . 6 . 2005  
 6 . 6 . 2005  
 7 . 6 . 2005  
 8 . 6 . 2005  
 9 . 6 . 2005  
 10 . 6 . 2005 
 11 . 6 . 2005 
 15 . 6 . 2005 
 16 . 6 . 2005 
 17 . 6 . 2005 
 18 . 6 . 2005 
 19 . 6 . 2005 
 22 . 6 . 2005 
 23 . 6 . 2005 
 24 . 6 . 2005 
 25 . 6 . 2005 
 26 . 6 . 2005 
 27 . 6 . 2005 
 28 . 6 . 2005 
 29 . 6 . 2005 
 30 . 6 . 2005 
 31 . 6 . 2005 


Примечание: работает в версии MySQL 4.1.

P.S. Если у кого есть какие мысли по доработке данного метода, или же кто-то знает более оптимальный способ решения, то поделитесь пожалуйста. :)
...
Рейтинг: 0 / 0
Все вопросы по MySQL "Cook Room"
    #33131684
Фотография Berkut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Sarin
Sarin
... Как вычистить таблицу в этом случае?

Насчёт кандидата: тривиально и есть в мануале. Не стоит.

А где? :)
...
Рейтинг: 0 / 0
Все вопросы по MySQL "Cook Room"
    #33135025
Sarin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уф-ф-ф. Давно меня тут не было:)
В мануале не помню где:). Но где-то я про такое читал уже.

Вот вам задачка. Транспонировать выборку средствами SQL. Помойму задача достойна гениев:)
...
Рейтинг: 0 / 0
Все вопросы по MySQL "Cook Room"
    #33135184
Фотография Berkut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SarinВот вам задачка. Транспонировать выборку средствами SQL. Помойму задача достойна гениев:)Уже где-то видел такое :), только не на форуме по MySQL. Только пока не знаю, где это реально может быть применимо на практике? И стоит ли нагружать в таком случае сервер, если данную операцию можно проделать на клиенте.
...
Рейтинг: 0 / 0
Все вопросы по MySQL "Cook Room"
    #33135189
Фотография Berkut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Berkut SarinВот вам задачка. Транспонировать выборку средствами SQL. Помойму задача достойна гениев:)Уже где-то видел такое :), только не на форуме по MySQL.
FAQ: Oracle->Sql-> Транспонирование строк в столбцы
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Все вопросы по MySQL "Cook Room"
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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