Главная :: Форум :: Web ClipArt :: Поиск :: Статистика :: Топ 10 :: Публикация :: Рекомендовать
netadmin.ws
Панель управления Регистрция свободна! Календарь Список пользователей Часто задаваемые вопросы Поиск по форуму Архив скриптов Главная   
Форум сетевых администраторов
Форум сетевых администраторов Форум сетевых администраторов » Базы данных » MySQL » Выборка недастающих данных
Предыдущая тема     Следующая тема
Автор
Тема    Новая тема     Ответить на эту тему
polo
Администратор
Средний рейтинг: 4.77 | Оценок: 106
/нажмите чтобы посмотреть кто оценивал/

Зарегистрирован: May 2001
Место проживания:
Публикаций: 4642
Статус: polo в оф-лайне
Выборка недастающих данных [сообщение #34573]

имеется таблица вида
ид
набор
имя
содержит данные

code:

ид|  набор | имя
1 |     -1 | имя1
2 |     -1 | имя2
3 |     -1 | имя3
4 |     -1 | имя4
5 |      1 | имя1
6 |      1 | имя2



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

code:
3|  -1 | имя3
4|  -1 | имя4
5|   1 | имя1
6|   1 | имя2



Башка не варит уже сегодня

__________________
Всегда есть решение.

Сообщить модератору об этом сообщении | Предупреждение | IP: определен

Old Post 16-02-2003 23:08
Нажмите сюда для просмотра профайла polo Отправить Персональное сообщение polo Посетить домашнию страничку polo! Найти сообщения от polo Добавить polo в свой список друзей Редактировать/Удалить сообщение Ответить Цитируя
Gyrus
Участник+
Средний рейтинг: 5 | Оценок: 1

Зарегистрирован: Sep 2001
Место проживания:
Публикаций: 173
Статус: Gyrus в оф-лайне
[сообщение #34577]

Может просто добавишь еще один column и голову не будешь ломать и в будущем оно может пригодится? Про запас, так сказать, добавь еще пару-тройку колонок на всякий случай... Ð_то наверное самый простой вариант, мне лично не приходит в голову какой-либо хитрый запрос который сможет справится с задачей...

Но, ИМХО, найдется толковый програмист который меня поправит... С башкой у меня такая же фигня сегодня

__________________
Всё в наших руках.

Сообщить модератору об этом сообщении | Предупреждение | IP: определен

Old Post 17-02-2003 00:58
Нажмите сюда для просмотра профайла Gyrus Отправить Персональное сообщение Gyrus Найти сообщения от Gyrus Добавить Gyrus в свой список друзей Редактировать/Удалить сообщение Ответить Цитируя
Viktor
Участник+
Средний рейтинг: 4.89 | Оценок: 19
/нажмите чтобы посмотреть кто оценивал/

Зарегистрирован: Jun 2002
Место проживания: Украина
Публикаций: 617
Статус: Viktor в оф-лайне
[сообщение #34647]

Может немного не так - не проверял, но похоже на

SELECT имя FROM Tablename
WHERE набор=1 AND
(набор = -1 AND (NOT SELECT имя FROM Tablename WHERE набор=1))

__________________
Тест - проверка верности!

Сообщить модератору об этом сообщении | Предупреждение | IP: определен

Old Post 17-02-2003 09:34
Нажмите сюда для просмотра профайла Viktor Отправить Персональное сообщение Viktor Посетить домашнию страничку Viktor! Найти сообщения от Viktor Добавить Viktor в свой список друзей Редактировать/Удалить сообщение Ответить Цитируя
polo
Администратор
Средний рейтинг: 4.77 | Оценок: 106
/нажмите чтобы посмотреть кто оценивал/

Зарегистрирован: May 2001
Место проживания:
Публикаций: 4642
Статус: polo в оф-лайне
[сообщение #34682]

Gyrus не, нельзя добавить колонку по некоторым причинам, не буду их приводить.

Viktor не совсем понимаю этот запрос но в любом случае попробую. Тут надо использовать LEFT JOIN.

__________________
Всегда есть решение.

Сообщить модератору об этом сообщении | Предупреждение | IP: определен

Old Post 17-02-2003 17:46
Нажмите сюда для просмотра профайла polo Отправить Персональное сообщение polo Посетить домашнию страничку polo! Найти сообщения от polo Добавить polo в свой список друзей Редактировать/Удалить сообщение Ответить Цитируя
polo
Администратор
Средний рейтинг: 4.77 | Оценок: 106
/нажмите чтобы посмотреть кто оценивал/

Зарегистрирован: May 2001
Место проживания:
Публикаций: 4642
Статус: polo в оф-лайне
[сообщение #34700]

пример таблицы

code:

		
id|    set | name
--|--------|-----
1 |     -1 | имя1
2 |     -1 | имя2
3 |     -1 | имя3
4 |     -1 | имя4
5 |      1 | имя1
6 |      1 | имя2




Мне в голову пришел только один вариант, сделать выборку двумя запросами
1. Выбрать все -1 которым не соответсвует 1

PHP:

SELECT set1
.id, set1.set, set1.name FROM tblname set1
LEFT JOIN tblname set2  ON 
( set1.name = set2.name AND  set2.id = 1 ) 
WHERE set1.id = -1 AND set2.id IS NULL

//получим
id|    set | name
--|--------|-----
3 |     -1 | имя3
4 
|     -1 | имя4


2. Выбрать все 1

PHP:

SELECT id
, name, set FROM tblname WHERE id = 1

//получим
id|    set | name
--|--------|-----
5 |      1 | имя1
6 
|      1 | имя2


Потом программно их объеденить. Может у кого есть другие идеи на этот счет?

polo добавил 17-02-2003 в 23:44:50:
да уж, затраты на выполнения такого запроса баснословные, сами посудите [1.08149803 s] против простой выборке всех данных set=1 [0.04839003 s]

__________________
Всегда есть решение.

Сообщить модератору об этом сообщении | Предупреждение | IP: определен

Old Post 17-02-2003 23:25
Нажмите сюда для просмотра профайла polo Отправить Персональное сообщение polo Посетить домашнию страничку polo! Найти сообщения от polo Добавить polo в свой список друзей Редактировать/Удалить сообщение Ответить Цитируя
Viktor
Участник+
Средний рейтинг: 4.89 | Оценок: 19
/нажмите чтобы посмотреть кто оценивал/

Зарегистрирован: Jun 2002
Место проживания: Украина
Публикаций: 617
Статус: Viktor в оф-лайне
[сообщение #34750]

Да, здесь без дополнительных запросов или временных таблиц (смотря какая БД) не обойтись.

Сообщить модератору об этом сообщении | Предупреждение | IP: определен

Old Post 18-02-2003 12:19
Нажмите сюда для просмотра профайла Viktor Отправить Персональное сообщение Viktor Посетить домашнию страничку Viktor! Найти сообщения от Viktor Добавить Viktor в свой список друзей Редактировать/Удалить сообщение Ответить Цитируя
Rumata
Участник+
Средний рейтинг: 4.5 | Оценок: 12
/нажмите чтобы посмотреть кто оценивал/

Зарегистрирован: May 2002
Место проживания: Владимирская обл.|Москва
Публикаций: 165
Статус: Rumata в оф-лайне
[сообщение #35468]

Если я правильно понимаю, то твоя замудренная фраза "требуется выбрать данные набора 1, но также дополнить их данными из набора -1 если они не существуют в наборе 1" переводится на русский язык в контексте предоставленной таблицы, как "выбрать все уникальные имена". Ð_то делается не очень сложно:

code:

SELECT t1.*,t2.flag AS fl FROM 
test AS t1 LEFT JOIN test AS t2 ON (t1.flag<>t2.flag AND t1.name=t2.name) 
HAVING ISNULL(fl) OR (flag=1)



У меня в таблице поля id,flag и name. Только что проверил на MySQL 4.0.10-gamma - работает. На твоих данных получается:

code:
id |flag|name|  fl  
3  | -1 |n3  | NULL 
4  | -1 |n4  | NULL 
5  |  1 |n1  |-1 
6  |  1 |n2  |-1 

Сообщение было отредактировано Rumata 24-02-2003 в 17:01

Сообщить модератору об этом сообщении | Предупреждение | IP: определен

Old Post 24-02-2003 16:54
Нажмите сюда для просмотра профайла Rumata Отправить Персональное сообщение Rumata Посетить домашнию страничку Rumata! Найти сообщения от Rumata Добавить Rumata в свой список друзей Редактировать/Удалить сообщение Ответить Цитируя
polo
Администратор
Средний рейтинг: 4.77 | Оценок: 106
/нажмите чтобы посмотреть кто оценивал/

Зарегистрирован: May 2001
Место проживания:
Публикаций: 4642
Статус: polo в оф-лайне
[сообщение #35519]

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

__________________
Всегда есть решение.

Сообщить модератору об этом сообщении | Предупреждение | IP: определен

Old Post 24-02-2003 20:16
Нажмите сюда для просмотра профайла polo Отправить Персональное сообщение polo Посетить домашнию страничку polo! Найти сообщения от polo Добавить polo в свой список друзей Редактировать/Удалить сообщение Ответить Цитируя
SCHIZO
STFW
Средний рейтинг: 5 | Оценок: 8
/нажмите чтобы посмотреть кто оценивал/

Зарегистрирован: Jul 2002
Место проживания: Кольский п-ов
Публикаций: 305
Статус: SCHIZO в оф-лайне
[сообщение #38041]

Есть такие ключевые слова как ALL,DISTINCT,DISTINCTROW которые определяют как бцдцт обрабатываться строки с дублирующимися значениями
синтаксис типа такого: SELECT [ALL|DISTINCT|DISTINCTROW] select_list FROM tablename ....
P.S.
а из какого набора выбирать первым можно предопределить с помошью ORDER BY, GROUP, HAVING ....

__________________
FAQ OFF

Сообщение было отредактировано SCHIZO 18-03-2003 в 02:39

Сообщить модератору об этом сообщении | Предупреждение | IP: определен

Old Post 18-03-2003 02:36
Нажмите сюда для просмотра профайла SCHIZO Отправить Персональное сообщение SCHIZO Посетить домашнию страничку SCHIZO! Найти сообщения от SCHIZO Добавить SCHIZO в свой список друзей Редактировать/Удалить сообщение Ответить Цитируя



Формат времени GMT. Текущее время 21:07.
Новая тема   Ответить на эту тему [ Версия для печати Печать | Отправить эту страницу другу/знакомому! Отправить | Получать уведомления об обновлении этой темы Подписка ] Предыдущая тема     Следующая тема
Навигация по форуму:
Оценка темы:

Правила форума:
Вы не можете создавать новые темы.
Вы не можете отвечать на существующие темы.
Вы не можете прикреплять файлы.
Вы не можете редактировать свои сообщения.
HTML теги выкл.
Спец. код вкл.
Смайлики вкл.
[IMG] тег выкл.
 

Page generated in 0.21688890 seconds (97.11% PHP - 2.89% MySQL) with 23 queries.


  Главная :: Форум :: Web ClipArt :: Поиск :: Статистика :: Топ 10 :: Публикация :: Рекомендовать
©NetAdmin.ws, 2001-2026.
Powered by: vBulletin
Copyright ©2000, 2001, Jelsoft Enterprises Limited.