Форум сетевых администраторов
Показаны 9 сообщений на этой странице

Форум сетевых администраторов (http://netadmin.ws/forum/index.php)
- MySQL (http://netadmin.ws/forum/forumdisplay.php?forumid=40)
-- Выборка недастающих данных (http://netadmin.ws/forum/showthread.php?threadid=4386)


Помещено polo 16-02-2003 в 23:08:

Выборка недастающих данных

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

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



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

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


Помещено Gyrus 17-02-2003 в 00:58:

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

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

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


Помещено Viktor 17-02-2003 в 09:34:

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

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

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


Помещено polo 17-02-2003 в 17:46:

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

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

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


Помещено polo 17-02-2003 в 23:25:

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

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]

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


Помещено Viktor 18-02-2003 в 12:19:

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


Помещено Rumata 24-02-2003 в 16:54:

Если я правильно понимаю, то твоя замудренная фраза "требуется выбрать данные набора 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 


Помещено polo 24-02-2003 в 20:16:

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

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


Помещено SCHIZO 18-03-2003 в 02:36:

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

__________________
FAQ OFF


Формат времени GMT. Текущее время 21:57.
Показаны 9 сообщений на этой странице

Powered by: vBulletin Version 2.2.4
Copyright © Jelsoft Enterprises Limited 2000, 2001.