Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» SQL запрос

Автор: Sanyaaa
Дата сообщения: 15.04.2008 13:51
AndVGri ...гениально
Спасибо
Автор: AVI
Дата сообщения: 06.06.2008 15:06
подскажите по Mysql
есть таблица
-------------------
comp|time|info |
-------------------
| 1 | 10 | q |
| 1 | 15 | b |
| 2 | 7 | d |
| 1 | 10 | m |
| 3 | 12 | z |
| 2 | 8 | e |
| 1 | 17 | t |
| 1 | 12 | n |
| 2 | 4 | s |

нужно получить максимальное time для comp с соответствующим для time info, т.е.:

-------------------
comp|time|info |
-------------------
| 1 | 17 | t |
| 2 | 8 | e |
| 3 | 12 | z |

делаю SELECT comp,MAX(time),info FROM table GROUP BY comp
но при этом info не соответствует time'у...

заранее спасибо
Автор: Kott
Дата сообщения: 06.06.2008 16:04
Как минимум на большинстве серверов подобный запрос вообще работать не будет
В условие группировки должно быть обязательно включено info. Если в таком виде запрос не устраивает - то используйте HAVING
Автор: AVI
Дата сообщения: 06.06.2008 17:33

Цитата:
Как минимум на большинстве серверов подобный запрос вообще работать не будет

почему не будет работать?
сервер выделенный, но все равно интересно

Цитата:
Если в таком виде запрос не устраивает - то используйте HAVING

можно с этим поподробнее? мне казалась что having совсем для других целей?
Автор: andead
Дата сообщения: 07.06.2008 02:15

Цитата:
но при этом info не соответствует time'у...

даже если вам удастя получить info соответствующего time'у то как вы поступите в таком случае:

Код: -------------------
|comp|time|info |
-------------------
| 66 | 999 | q |
| 66 | 999 | b |
-------------------
Автор: AVI
Дата сообщения: 07.06.2008 15:46
andead
значения столбца time в данном случае это unix timestamp, скрипт будет запускать один пользователь... поэтому вероятность появления одинакового времени, крайне мала

кому интересно вот вариант решения :


Код:
SELECT t.* FROM (
SELECT comp, MAX(time) AS time FROM table GROUP BY comp
) q
JOIN table t ON t.comp=q.comp AND t.time=q.time
Автор: DeADMoHAX
Дата сообщения: 07.08.2008 14:11
как наиболее оптимально в столбце DATETIME заменить дату на текущую, не меняя времени? можно ли обойтись без чтения из таблицы? бд MySQL 4.1.
Автор: dneprcomp
Дата сообщения: 09.08.2008 02:40
DeADMoHAX
Заменить на какую? Если все даты меняются на одну и ту же фиксированую величину дней, то запросом
Код: UPDATE dbo.Table2
SET dbo.Table2.YourField = DATEADD(day, QuantityOfDays, YourField)
FROM dbo.Table2
Автор: DeADMoHAX
Дата сообщения: 10.08.2008 02:49
dneprcomp
оО спасибо огромное, а то я не дождался и написал версию с чтением.. правда все равно палка о 2х концах, надо не просто увеличить дату, а поставить текущую... ну да посмотрим..
Автор: dneprcomp
Дата сообщения: 10.08.2008 19:44
DeADMoHAX
UPDATE dbo.Table2
SET dbo.Table2.YourField = DATEADD(day, DATEDIFF(day, YourField, GETDATE()) , YourField)
FROM dbo.Table2
Автор: sergiuz1303
Дата сообщения: 29.08.2008 22:45
Доброе время суток!
есть три поля t1 t2 t3 char (255) как получить строку t4 char(255)
к примеру
t1 'test '
t2 'tyutiiutiutitiiytiutuy '
t3 'kjhkhkjhkhkhkjh '
как получить строку с видом
t4 'test tyutiiutiutitiiytiutuy kjhkhkjhkhkhkjh'

Заранее благодарен
ПС Срази извиняюсь за ламерский вопрос
Автор: Jokerjar79
Дата сообщения: 29.08.2008 23:48
select concat(trim(t1),' ',trim(t2),' ',trim(t3)) from ...
Автор: Anton T
Дата сообщения: 12.09.2008 07:16
Как удалить повторяющиеся записи из связанной таблицы?
Автор: apnss
Дата сообщения: 12.09.2008 23:02

Цитата:
Как удалить повторяющиеся записи из связанной таблицы?


из связанной никак пока есть записи в главной таблицы ссылающиеся на дублирующиеся записи связанной таблицы

для простой таблицы в MSSQL


Цитата:

select distinct * into t3 from t2
drop table t2
EXEC sp_rename 't3', 't2'


Добавлено:
для начала скажи сервер на котором нужно это сделать
Автор: OXDBA
Дата сообщения: 15.09.2008 11:51

Цитата:
Как удалить повторяющиеся записи из связанной таблицы?

Удаляем все записи имеющие дубликаты или оставляем одну, а ее дубликаты удаляем?
Значения всех полей одинаковые или только PK? Какая СУБД - страшная тайна?
Автор: dneprcomp
Дата сообщения: 18.09.2008 05:31
Надо делать автоматический апдейт 2-ух tables.
В 1-ом делаю апдейт нескольких полей. Во второй надо добавить рекорды, используя лист of ID измененых рекордов в первом.
Каким образом можно это сделать на уровне stored procedure. База - MS SQL
Автор: sorokin88
Дата сообщения: 18.09.2008 09:19
Лучше использовать триггер:
CREATE TRIGGER trig_updateTable1 ON Table1 FOR UPDATE
AS
INSERT INTO table2 (id_updated) VALUES(SELECT id FROM Deleted)
Автор: OXDBA
Дата сообщения: 18.09.2008 09:48

Цитата:
SELECT id FROM Deleted

Уверен насчет Deleted?
Автор: sorokin88
Дата сообщения: 18.09.2008 14:21
Да, Deleted - старый вариант записи, который был до внесения изменений, а Inserted - тот, что с новыми данными. Можно обращаться к обоим.
Автор: OXDBA
Дата сообщения: 18.09.2008 17:22
sorokin88
Вот и я об Inserted...
Автор: dneprcomp
Дата сообщения: 18.09.2008 18:57
sorokin88 OXDBA
Если это для меня обсуждали, то спасибо. Хотя именно тригер и не подойдет. Он будет срабатывать на любой update, а надо только от данного процесса. Попробую вызывать из самой процедуры.
Автор: dneprcomp
Дата сообщения: 18.09.2008 22:13
Сделал с помощью Cursor
Автор: BigMonster
Дата сообщения: 19.09.2008 05:46
Если нужно делать автоматически - то можно выполнять из триггера по условию if update(column), либо @@ProcID плюс trigger - если возникнет исключение SQL сам его отрулит. при выполнение операции из процедуры (тем более в курсоре) исключение прервёт операцию, но всё что до этого было выполненно останется т.е. update,insert,delete (если только в процедуре не использовать @@error и не обрабатывать логику исключений...)
Автор: artemk
Дата сообщения: 28.10.2008 02:32
доброго времени суток!
есть бд из примерно 60 таблиц
нужно найти имя таблицы в которой есть запись "Привет". в каком поле не важно.
Возможно ли это? заранее благодарен
Автор: EZH
Дата сообщения: 28.10.2008 23:07
artemk
Тут два варианта, и оба требуют специфики конкретной СУБД, это не решается в общем случае на стандартном SQL:
- Либо есть некий спец сервис полнотекстового поиска, который натравливается на ранее проиндексированную им БД (напр. для MS SQL Server есть такой)
- Либо пишется вручную перебор всех таблиц и поиск по всем их текстовым полям. Но для этого нужено опять же сначала получить метаданные из БД (так для MS SQL и там, скажем, Firebird/Interbase это делается по разному)
Автор: artemk
Дата сообщения: 29.10.2008 03:40
EZH
спасибо
проблема приятеля, дальше для меня темный лес
Автор: DriftK
Дата сообщения: 29.10.2008 04:13
EZH
У меня MySQL какой синтаксис запроса для перебора всех таблиц и поиск по всем их текстовым полям?
Автор: EZH
Дата сообщения: 29.10.2008 09:02
DriftK
В MySQL 5 есть специальные вьюхи для получения метаданных, которые сгруппированы в INFORMATION_SCHEMA. Так запрос

SELECT * FROM INFORMATION_SCHEMA.TABLES

даст тебе список таблиц/вьюх c их разными атрибутами (таблицы можно отфильтровать по полю TABLE_TYPE).
А запрос

SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'table_name'

дасть тебе список полей конкретной таблицы (текстовые поля отфильтровываются по полю DATA_TYPE).

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

http://dev.mysql.com/doc/refman/5.0/en/information-schema.html
Автор: AlexCoRu
Дата сообщения: 02.11.2008 11:07

Цитата:
SELECT LEAST(outdate, '2008/09/30') - GREATEST(indate, '2008/09/1') + 1
FROM sometable
WHERE '2008/09/01' <= outdate AND indate <= '2008/09/30'

Реальный запрос несколько сложней, но суть в том, что как записано выполняется и возвращает верный результат. Но вместо констант неоходимо использовать параметры.

И так выполняется:

Цитата:
SELECT LEAST(outdate, '2008/09/30') - GREATEST(indate, '2008/09/1') + 1
FROM sometable
WHERE :Date1 <= outdate AND indate <= :Date2

А вот так:

Цитата:
SELECT LEAST(outdate, :Date2) - GREATEST(indate, :Date1) + 1
FROM sometable
WHERE :Date1 <= outdate AND indate <= :Date2
CommandText does not return a result set.

Проблема именно в запросе. Пробовал и Delphi, и FastReport. Ошибки в передаче параметров не должно быть.
Кратко поясню. Человек проживал с indate по outdate. Необходимо получить количество дней его проживания с :Date1 по :Date2. Сервер Progress SQL-92 через ADO.
Автор: ChiPnGo
Дата сообщения: 05.11.2008 19:33
Нужно получить первую таблицу из 2х последних, хелп.

id    Name IsRoot Parent_id
1    state 1    0    21
2    state 2    0    21
3    state 3    0    21
4    state 4    0    21
5    state 5    0    21
6    type1    0    1
7    type 2    0    1
8    type 3    0    1
9    type 1    0    2
10    type 2    0    2
11    type 3    0    2
12    type 1    0    3
13    type 2    0    3
14    type 3    0    3
15    type 1    0    4
16    type 2    0    4
17    type 3    0    4
18    type 1    0    5
19    type 2    0    5
20    type 3    0    5
21    root    1     NULL

id    Name
.    type 1
.    rype 2
.    type 3

id    Name
.    state 1
.    state 2
.    state 3
.    state 4
.    state 5


Добавлено:
Пишут, что нельзя так просто пронумеровать записи по порядку в ms sql. Мб есть варианты?
С остальным проблем нет.

Добавлено:
Работает.

Страницы: 1234567891011121314

Предыдущая тема: Строковый параметр в REG_BINARY


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.