Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » SQL запрос

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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

Открыть новую тему     Написать ответ в эту тему

reflexfx



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Да и все таки смысл не увловил. Зачем этот "псевдоним"?

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

Всего записей: 46 | Зарегистр. 23-11-2004 | Отправлено: 12:29 25-06-2007
latin



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Господа, подскажите, как составить вот такой запрос.
Исходные данные:
Есть таблица <i>таблица1</i> и в ней столбцы <i>поле1</i>, <i>поле2</i>, ...<i>полеN</i>. Необходимо сделать выборку удовлетворяющую следующим условиям - подсчитать количество записей в <i>поле2</i> которые соответствуют, например, значениям 1 и 2, а так же подсчитать количество записей которые не равны этим значениям. Результат вывести сгруппированным по <i>поле1</i>.  Просто подсчитать количество записей по какому то одному условию у меня получилось вот таким запросом: <i>Select поле1, COUNT(поле2) AS Условие1, COUNT(поле2) AS Условие2 from таблица1 WHERE поле2 <>1 and поле2 <>2 group by поле1</i>, а как сделать чтобы отбор производился по обоим условиям? Я пробовал и объединять несколько запросов и делать вложенные запросы, но результатов это не давало. Скорее всего я не правильно строил эти запросы.
Я не очень хорошо разбираюсь в этом вопросе так что если возможно, то с примером и по подробнее.

----------
Помни, правильно заданный вопрос это половина ответа
Те, кто жили до нас, многое свершили, но ничего не завершили. Сенека

Всего записей: 781 | Зарегистр. 01-03-2006 | Отправлено: 23:53 06-02-2008
AndVGri

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
latin

Код:
 
Select p.Field1, p.With12, s.Not12 From  
    (Select Field1, Count(Field2) As With12 From Table1
    Where Field2 In (1, 2) Group By Field1) As p
Inner Join
    (Select Field1, Count(Field2) As Not12 From Table1
    Where Field2 Not In (1, 2) Group By Field1) As s
On p.Field1 = s.Field1;
 

P. S. Проверял в Access, для других, возможно, потребуется убрать Inner Join, As, On

Всего записей: 750 | Зарегистр. 14-12-2005 | Отправлено: 16:16 07-02-2008
latin



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
AndVGri
 
Спасибо за подсказку, все получилось, у меня тоже база в формате Access. Только вместо  Inner Join использовал Left Join т.к. количество записей различается.

----------
Помни, правильно заданный вопрос это половина ответа
Те, кто жили до нас, многое свершили, но ничего не завершили. Сенека

Всего записей: 781 | Зарегистр. 01-03-2006 | Отправлено: 17:44 09-02-2008
AndVGri

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
latin

Цитата:
количество записей различается

Тогда лучше

Код:
 
 Select MT.Field1, p.With12, s.Not12 From  
((Select Field1 From Table1 Group By Field1) As MT Left Join
    (Select Field1, Count(Field2) As With12 From Table1
    Where Field2 In (1, 2) Group By Field1) As p
On MT.Field1 = p.Field1) Left Join
    (Select Field1, Count(Field2) As Not12 From Table1
    Where Field2 Not In (1, 2) Group By Field1) As s
On MT.Field1 = s.Field1;  
 

Всего записей: 750 | Зарегистр. 14-12-2005 | Отправлено: 17:51 09-02-2008 | Исправлено: AndVGri, 04:02 10-02-2008
needDrivers

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Помогите оптимизировать MySQL запрос!

Код:
Таблица 1. Список городов. (cc)
code - Идентификатор
name - Название города
 
Таблица 2. Запросы пользователей. (ur)
id
date
src - Идентификатор города из тбл. 1.
dst - Идентификатор города из тбл. 1.
 

 
Надо получить список из 10-ти часто используемых в запросах городов.
Делаю так:

Код:
SELECT cc.id, cc.name, COUNT(*) as rc
FROM ur  
LEFT JOIN cc ON cc.id = ur.src OR cc.id = ur.dst
GROUP BY cc.id
ORDER BY rc DESC
LIMIT 10

Как можно оптимизировать?

Всего записей: 60 | Зарегистр. 23-05-2003 | Отправлено: 10:26 18-03-2008
dmka



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Как можно оптимизировать?

Можно индексы построить по src и dst. Если у тебя для web-а используется, то имеет смысл закэшировать результат на какое-то время и не дергать sql на каждой странице.

Всего записей: 947 | Зарегистр. 23-04-2003 | Отправлено: 11:18 18-03-2008
needDrivers

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Индексы давно созданы.
Да, наверное всё-таки придётся делать временную таблицу.

Всего записей: 60 | Зарегистр. 23-05-2003 | Отправлено: 19:25 18-03-2008
Sanyaaa

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
подскажите уважаемые, есть запрос к Oracle
 
SELECT   SUM (таблица.поле2деньги) allias2
    FROM схема.таблица
   WHERE (    (таблица.поле3индентификатор = 'QQQ')
          AND (таблица.datet <= '01.01.2008')
          )
GROUP BY таблица.поле1
 
Выводит табличку (, сгруппированная по полю1, сумма из поля деньги, при условии что поле3=QQQ, поле дата <= '01.01.2008')
 
 
+--------+  
| allias2|  
+--------+
|   4534 |  
|   3538 |  
|   1563 |  
|   4231 |  
+--------+  
 
Как бы сформировать запрос, чтобы добавить условие таблица.datet <= '01.01.2007' и вывести в столбец рядом с allias2?
 
+--------++--------+  
| allias2|| allias3|  
+--------++--------+
|   4534 ||   2331 |  
|   3538 ||   9335 |  
|   1563 ||   3622 |  
|   4231 ||   7564 |  
+--------++--------+  
 
 
Т.е. грубо говоря  
SELECT   SUM (таблица.поле2деньги) allias2
    FROM схема.таблица
   WHERE (    (таблица.поле3индентификатор = 'QQQ')
          AND (таблица.datet <= '01.01.2008')
          )
GROUP BY таблица.поле1
и такой же запрос, но при условии таблица.datet <= '01.01.2008' - вывести в колонку рядом

Всего записей: 323 | Зарегистр. 04-02-2003 | Отправлено: 11:20 11-04-2008
AndVGri

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Sanyaaa
Объединённый
Select f.alias1, s.alias2 From
(SELECT таблица.поле1,  SUM (таблица.поле2деньги) allias1
    FROM схема.таблица
   WHERE ((таблица.поле3индентификатор = 'QQQ')
   AND (таблица.datet <= '01.01.2008'))
   GROUP BY таблица.поле1) f,
(SELECT таблица.поле1,  SUM (таблица.поле2деньги) allias2
    FROM схема.таблица
   WHERE ((таблица.поле3индентификатор = 'QQQ')
   AND (таблица.datet <= '01.01.2007'))
   GROUP BY таблица.поле1) s
Where f.поле1 = s.поле1

Всего записей: 750 | Зарегистр. 14-12-2005 | Отправлено: 04:24 12-04-2008
Sanyaaa

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
AndVGri ...гениально
Спасибо

Всего записей: 323 | Зарегистр. 04-02-2003 | Отправлено: 14:51 15-04-2008 | Исправлено: Sanyaaa, 09:42 17-04-2008
AVI

Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
подскажите по 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'у...
 
заранее спасибо  

Всего записей: 73 | Зарегистр. 22-02-2003 | Отправлено: 16:06 06-06-2008
Kott



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Как минимум на большинстве серверов подобный запрос вообще работать не будет
В условие группировки должно быть обязательно включено info. Если в таком виде запрос не устраивает - то используйте HAVING

Всего записей: 161 | Зарегистр. 12-12-2003 | Отправлено: 17:04 06-06-2008
AVI

Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

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

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

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

можно с этим поподробнее? мне казалась что having совсем для других целей?

Всего записей: 73 | Зарегистр. 22-02-2003 | Отправлено: 18:33 06-06-2008
andead



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

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

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

Код:
-------------------  
|comp|time|info |  
-------------------  
|  66   | 999  |  q  |  
|  66   | 999  |  b  |
-------------------

 
когда два максимальных времени у одного компа будут одинаковы?))

Всего записей: 1821 | Зарегистр. 22-09-2005 | Отправлено: 03:15 07-06-2008
AVI

Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
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
 

 
спасибо Nick Anikin с sql.ru

Всего записей: 73 | Зарегистр. 22-02-2003 | Отправлено: 16:46 07-06-2008
DeADMoHAX



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
как наиболее оптимально в столбце DATETIME заменить дату на текущую, не меняя времени? можно ли обойтись без чтения из таблицы? бд MySQL 4.1.

----------
dmlabs.ru || hackconnect.ru
Выгодно России – значит, хорошо. Не выгодно России – пошёл на хер.

Всего записей: 1367 | Зарегистр. 03-02-2005 | Отправлено: 15:11 07-08-2008
dneprcomp



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
DeADMoHAX
Заменить на какую? Если все даты меняются на одну и ту же фиксированую величину дней, то запросом
Код:
UPDATE dbo.Table2  
SET dbo.Table2.YourField = DATEADD(day, QuantityOfDays, YourField)
FROM dbo.Table2
QuantityOfDays может быть и отрицательным.
 
PS. Если в MYSQL есть функция DATEADD

Всего записей: 3920 | Зарегистр. 31-03-2002 | Отправлено: 03:40 09-08-2008 | Исправлено: dneprcomp, 03:42 09-08-2008
DeADMoHAX



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
dneprcomp
оО спасибо огромное, а то я не дождался и написал версию с чтением.. правда все равно палка о 2х концах, надо не просто увеличить дату, а поставить текущую... ну да посмотрим..

----------
dmlabs.ru || hackconnect.ru
Выгодно России – значит, хорошо. Не выгодно России – пошёл на хер.

Всего записей: 1367 | Зарегистр. 03-02-2005 | Отправлено: 03:49 10-08-2008
dneprcomp



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
DeADMoHAX
UPDATE dbo.Table2  
SET dbo.Table2.YourField = DATEADD(day, DATEDIFF(day, YourField, GETDATE()) , YourField)  
FROM dbo.Table2

Всего записей: 3920 | Зарегистр. 31-03-2002 | Отправлено: 20:44 10-08-2008
Открыть новую тему     Написать ответ в эту тему

Страницы: 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

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » SQL запрос


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru