imho.ws
IMHO.WS  

Вернуться   IMHO.WS > Компьютеры > Программирование
Опции темы
Старый 23.10.2005, 15:30     # 1
Raven B.
Member
 
Аватар для Raven B.
 
Регистрация: 12.07.2004
Адрес: Очень странное место.
Сообщения: 328

Raven B. Известность не заставит себя ждатьRaven B. Известность не заставит себя ждать
Помогите с SQL запросом. Вопрос по получению уникальной записи.

Доброго времени суток.
Есть рабочий запрос:

Цитата:
sql_q = "SELECT control_t.control_id, ph_f_control_comp_t.control_comp_id, control_t.control"
sql_q = sql_q & " FROM ph_f_control_comp_t, control_comp_t, control_t"
sql_q = sql_q & " WHERE ((Str(control_comp_t.control_id) = Str(control_t.control_id))"
sql_q = sql_q & " AND (str(ph_f_control_comp_t.control_comp_id)=str(control_comp_t.control_c omp_id))"
sql_q = sql_q & " AND (ph_f_control_comp_t.norm_id = '" & veg & "')) GROUP BY control_t.control_id;"
Но надо что бы в результате я получил только записи с уникальным полем control_t.control_id (остальные поля могут дублироватся, так что DISTINC не подходит).
Насколько я понял такой результат я могу получит ь используя GROUP BY control_t.control_id.
Но такой вот запрос не работает:

Цитата:
sql_q = "SELECT control_t.control_id, ph_f_control_comp_t.control_comp_id, control_t.control"
sql_q = sql_q & " FROM ph_f_control_comp_t, control_comp_t, control_t"
sql_q = sql_q & " WHERE ((Str(control_comp_t.control_id) = Str(control_t.control_id))"
sql_q = sql_q & " AND (str(ph_f_control_comp_t.control_comp_id)=str(control_comp_t.control_c omp_id))"
sql_q = sql_q & " AND (ph_f_control_comp_t.norm_id = '" & veg & "')) GROUP BY control_t.control_id;"
Первый и второй запросы во время выполнения выглядят как :
1:
Цитата:
SELECT control_t.control_id, ph_f_control_comp_t.control_comp_id, control_t.control FROM ph_f_control_comp_t, control_comp_t, control_t WHERE ((Str(control_comp_t.control_id) = Str(control_t.control_id)) AND (str(ph_f_control_comp_t.control_comp_id)=str(control_comp_t.control_c omp_id)) AND (ph_f_control_comp_t.norm_id = '23'));
2:
Цитата:
SELECT control_t.control_id, ph_f_control_comp_t.control_comp_id, control_t.control FROM ph_f_control_comp_t, control_comp_t, control_t WHERE ((Str(control_comp_t.control_id) = Str(control_t.control_id)) AND (str(ph_f_control_comp_t.control_comp_id)=str(control_comp_t.control_c omp_id)) AND (ph_f_control_comp_t.norm_id = '23')) GROUP BY control_t.control_id;
Если необходима структура таблиц, то вот она :

Есть три таблицы:
Цитата:
-------
ph_f_control_comp_t
-------
norm_id
control_comp_id
ph_f_control_comp_id
-------
control_comp_t
-------
control_id
std_id
control_comp_id
-------
control_t
-------
control
control_id
Поможете разобратся в чем дело ?
Raven B. вне форума  
Старый 24.10.2005, 11:15     # 2
LightImage
Junior Member
 
Регистрация: 16.10.2002
Адрес: Россия-матушка
Пол: Male
Сообщения: 96

LightImage Нимб уже пробиваетсяLightImage Нимб уже пробивается
Raven B.:
Попробуй так:
Код:
sql_q = "SELECT control_t.control_id, FIRST(ph_f_control_comp_t.control_comp_id), FIRST(control_t.control)"
sql_q = sql_q & " FROM ph_f_control_comp_t, control_comp_t, control_t"
sql_q = sql_q & " WHERE ((Str(control_comp_t.control_id) = Str(control_t.control_id))"
sql_q = sql_q & " AND (str(ph_f_control_comp_t.control_comp_id)=str(control_comp_t.control_c omp_id))"
sql_q = sql_q & " AND (ph_f_control_comp_t.norm_id = '" & veg & "')) GROUP BY control_t.control_id;"
__________________
1 миллибайт = 1/1024 байта

Последний раз редактировалось LightImage; 24.10.2005 в 12:28.
LightImage вне форума  
Старый 25.10.2005, 09:45     # 3
Raven B.
Member
 
Аватар для Raven B.
 
Регистрация: 12.07.2004
Адрес: Очень странное место.
Сообщения: 328

Raven B. Известность не заставит себя ждатьRaven B. Известность не заставит себя ждать
Не помогло. Дает 0 вхождений.
Чесноговоря не понял при чем здесь FIRST.
В доках написано что он вообще не к SELECT применяется. Или я что то пропуситл ?
Цитата:
В версии MySQL 3.22 и более поздних можно использовать FIRST или ADD ... AFTER имя_столбца для добавления столбца на заданную позицию внутри табличной строки. По умолчанию столбец добавляется в конце. Начиная с версии MySQL 4.0.1, можно также использовать ключевые слова FIRST и AFTER в опциях CHANGE или MODIFY.


С уважением. Ворон.
Raven B. вне форума  
Старый 25.10.2005, 10:54     # 4
LightImage
Junior Member
 
Регистрация: 16.10.2002
Адрес: Россия-матушка
Пол: Male
Сообщения: 96

LightImage Нимб уже пробиваетсяLightImage Нимб уже пробивается
А, так это MySQL, я почему-то думал это в Access =)
Ну в общем агрегатные функции надо использовать для остальных столбцов, по которым группировка не ведется. Замени FIRST, скажем, на MAX.
__________________
1 миллибайт = 1/1024 байта
LightImage вне форума  
Старый 25.10.2005, 12:35     # 5
Raven B.
Member
 
Аватар для Raven B.
 
Регистрация: 12.07.2004
Адрес: Очень странное место.
Сообщения: 328

Raven B. Известность не заставит себя ждатьRaven B. Известность не заставит себя ждать
Цитата:
А, так это MySQL, я почему-то думал это в Access =)
Так, и про то и про другое ведь.

Ничего не вышло. Результат - нулевой выход.
Впротчем я проблему обойдя ее. Увеличелось количество запросов. Но что ж поделаешь
Так что тему можно закрывать.
Raven B. вне форума  
Старый 10.11.2005, 21:33     # 6
S_Gur
Junior Member
 
Регистрация: 13.09.2002
Адрес: Moscow
Сообщения: 110

S_Gur Путь к славе только начался
Почему Distinct не подходит? Он выдает уникальные наборы тех полей, которые ты запрашиваешь. Если твое поле будет уникальным, а остальные поля повторяться - это прекрасно будет соответствовать условию
S_Gur вне форума  
Старый 11.11.2005, 13:23     # 7
Raven B.
Member
 
Аватар для Raven B.
 
Регистрация: 12.07.2004
Адрес: Очень странное место.
Сообщения: 328

Raven B. Известность не заставит себя ждатьRaven B. Известность не заставит себя ждать
distinct проверяет уникальность всего селекта. там три поля. 2 дублируются.
писал об этом в сабже.
Попробуй.
Raven B. вне форума  
Старый 11.11.2005, 14:40     # 8
LightImage
Junior Member
 
Регистрация: 16.10.2002
Адрес: Россия-матушка
Пол: Male
Сообщения: 96

LightImage Нимб уже пробиваетсяLightImage Нимб уже пробивается
Так тебе надо из записей с повторяющимися значениями 2-го и 3-го полей выбрать одну с любым значением 1-го поля? Тогда группируй по 2-му и 3-му полям, а к 1-му применяй агрегатную функцию, такую как First, Max, Min и т.п., в зависимости от синтаксиса используемой СУБД
__________________
1 миллибайт = 1/1024 байта
LightImage вне форума  
Старый 11.11.2005, 15:21     # 9
Raven B.
Member
 
Аватар для Raven B.
 
Регистрация: 12.07.2004
Адрес: Очень странное место.
Сообщения: 328

Raven B. Известность не заставит себя ждатьRaven B. Известность не заставит себя ждать
Из
control_t.control_id, ph_f_control_comp_t.control_comp_id, control_t.control

ph_f_control_comp_t.control_comp_id - всегда уникальна
а control_t.control_id и control_t.control часто дублируются.

Надо было оставить только вхождения с уникальными control_t.control_id и control_t.control. DISTINCT не работал из за того что ph_f_control_comp_t.control_comp_id всегда уникальна.

MIN и MAX дают 0 выход почему то.
СУБД - Access.

В принципе задача уже не актуальна так как я решил ее разбив запрос на несколько запросов.
Raven B. вне форума  
Старый 26.11.2005, 23:33     # 10
Bondiks
Guest
 
Сообщения: n/a

Покажи кусок данных: которые есть и которые надо получить, тогда и решение быстрее получишь.
 
Старый 27.11.2005, 18:27     # 11
Raven B.
Member
 
Аватар для Raven B.
 
Регистрация: 12.07.2004
Адрес: Очень странное место.
Сообщения: 328

Raven B. Известность не заставит себя ждатьRaven B. Известность не заставит себя ждать
Тему уже можно закрыть =)
Проблему я решил "в обход". Сделав несколько запросов.
А саму БД пару дней назад сдал заказчику. =)
Raven B. вне форума  

Опции темы

Ваши права в разделе
Вы НЕ можете создавать новые темы
Вы не можете отвечать в темах.
Вы НЕ можете прикреплять вложения
Вы НЕ можете редактировать свои сообщения

BB код Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.

Быстрый переход


Часовой пояс GMT +4, время: 02:40.




Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.