Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MySQL > Выборка из двух таблиц


Автор: Gold Dragon 19.11.2005, 14:13
Народ, я видел такой подобный вопрос, но что-то не могу его уже найти, даже не помню в каком он разделе форума..

В общем, у меня есть таблица, в обеех есть поле Name, только в первой значение индивидуально, а во второй одно и то же значение может встречаться несколько раз.. Вопрос: как мне сделать выборку из двух таблиц неповторяющиеся значения?
Что то типа токого select distinct name from ... только у меня ничего не получается

Автор: Kesh 19.11.2005, 14:22
Чего-то я не совсем вопрос понял... А чем select distinct name from ... не подходит?

Автор: Gold Dragon 19.11.2005, 17:10
что-то у меня не получается... из одной таблицы всё нормально, но из двух не получается.. Может конечно где-то в синтаксисе ошибка

Автор: Akina 19.11.2005, 23:38
Структуру таблиц и пример их наполнения и желаемого результата - в студию. а то ни хрена не понять...

Автор: Gold Dragon 20.11.2005, 08:54
Код

CREATE TABLE `kabak` (
  `id` int(11) NOT NULL auto_increment,
  `name_kabak` varchar(255) NOT NULL default '',
  `inf` text NOT NULL,
  `id_area` int(11) NOT NULL default '0',
  `id_street` int(11) NOT NULL default '0',
  `dom` tinyint(4) NOT NULL default '0',
  `index` tinyint(1) NOT NULL default '1',
  PRIMARY KEY  (`id`)
) TYPE=MyISAM COMMENT='описание кабака' AUTO_INCREMENT=7 ;
Код

CREATE TABLE `comment` (
  `id` int(11) NOT NULL auto_increment,
  `id_kabak` int(11) default NULL,
  `name_kabak` varchar(255) default NULL,
  `com_user` text NOT NULL,
  `data_user` datetime NOT NULL default '0000-00-00 00:00:00',
  `com_admin` text,
  `data_admin` datetime NOT NULL default '0000-00-00 00:00:00',
  `bal` tinyint(4) NOT NULL default '6',
  `index` tinyint(1) NOT NULL default '0',
  `ip_user` varchar(15) NOT NULL default '0.0.0.0',
  PRIMARY KEY  (`id`)
) TYPE=MyISAM AUTO_INCREMENT=80 ;


а это мои эксперементы
Код

select distinct name_kabak from `comment`,`kabak` WHERE `index`=1 ORDER BY `name_kabak`
Код

SELECT distinct t1.name_kabak, t2.name_kabak FROM comment AS t1, kabak AS t2 WHERE t1.index=1, t2.index=1 ORDER BY t1.name_kabak, t2.name_kabak




Автор: Secandr 20.11.2005, 09:17
Red Dragon таблицы связывать надо

Как у тебя связаны две талицы?

Автор: Gold Dragon 20.11.2005, 12:16
Таблици никак не связаны, это абсолютно разные таблицы, хранящие разную информацию. Единственное - это name_kabak и в первой и во второй таблицеонимогут совпадать или друг друга дополнять

Автор: Secandr 20.11.2005, 13:50
Какие данные тее получить надо?

Автор: Gold Dragon 20.11.2005, 17:56
уникальные

Автор: Secandr 20.11.2005, 18:56
Red Dragon что ты выбрать из талицы хочешь?

Автор: Gold Dragon 20.11.2005, 21:37
Ну так уникальные значеиня из name_kabak из двух таблиц

Автор: Kesh 20.11.2005, 22:03
Что-то вроде этого...
Код

(select distinct name_kabak 
from `kabak` 
WHERE `index`=1)
union
(select distinct name_kabak 
from `comment` 
WHERE (`index`=1) 
and not name_kabak in
(select distinct name_kabak 
from `kabak` 
WHERE `index`=1))
 ORDER BY `name_kabak`


Пусть через задницу - но должно работать...

Автор: Akina 20.11.2005, 23:10
Код

select distinct name_kabak 
from 
(
   (select name_kabak 
    from `kabak` 
    WHERE `index`=1)
  union
   (select name_kabak 
    from `comment` 
    WHERE `index`=1) 
)

Автор: Kesh 21.11.2005, 09:14
Akina Кстати да... smile

Автор: Gold Dragon 21.11.2005, 09:48
народ, вот читаю справочник, а там написано что Оператор UNION реализован в MySQL 4.0.0 а у меня MySQL 3.23.53

Автор: Ignat 21.11.2005, 09:53
Цитата(Red @ 21.11.2005, 09:48)
MySQL 3.23.53

Это у хостера или у тебя.
Если первое, то хостера меняй, если второе - обнови мускуль.
Ибо 3.23 морально устарела.

Автор: Gold Dragon 21.11.2005, 10:30
и у меня и у понетциального хостера smile
А какую версию оптимально ставить? ну чтоб хостер потом можно было найти и дешёвый и чтоб поддерживал

Автор: Ignat 21.11.2005, 10:32
ИМХО 4.1

Автор: Gold Dragon 21.11.2005, 12:45
вереставил себе всё... уё.. smile

выдаёт ошибку
Код

 SELECT DISTINCT name_kabak
FROM (
(

SELECT name_kabak
FROM `kabak`
WHERE `index` =1
)
UNION (

SELECT name_kabak
FROM `comment`
WHERE `index` =1
)
)
LIMIT 0 , 30

Ответ MySQL: Документация
#1248 - Every derived table must have its own alias 

Автор: Kesh 21.11.2005, 13:01
А мой работает?..

Автор: Gold Dragon 21.11.2005, 14:07
Код

 SQL-запрос: Документация

(
SELECT DISTINCT name_kabak
FROM `kabak`
WHERE `index` =1
)
UNION (

SELECT DISTINCT name_kabak
FROM `comment`
WHERE (
`index` =1
)
AND NOT name_kabak
IN (

SELECT DISTINCT name_kabak
FROM `kabak`
WHERE `index` =1
)
)
ORDER BY `name_kabak`
LIMIT 0 , 30

Ответ MySQL: Документация
#1054 - Unknown column 'index' in 'where clause' 

Автор: Kesh 21.11.2005, 15:10
Red Dragon Дык index у тебя был...

Замени во всем запросе `index`=1 на 1

Автор: Gold Dragon 21.11.2005, 15:14
не понял, что и где заменять, покажи код

Автор: Kesh 21.11.2005, 15:28
Код

(SELECT DISTINCT name_kabak    
FROM `kabak`)    
UNION 
(SELECT DISTINCT name_kabak    
FROM `comment`    
WHERE NOT name_kabak    
IN (SELECT DISTINCT name_kabak    
FROM `kabak`))    
ORDER BY `name_kabak`

или
Код

(    
SELECT DISTINCT name_kabak    
FROM `kabak`    
WHERE 1    
)    
UNION (    
SELECT DISTINCT name_kabak    
FROM `comment`    
WHERE NOT name_kabak    
IN (    
SELECT DISTINCT name_kabak    
FROM `kabak`    
WHERE 1    
))    
ORDER BY `name_kabak`

Автор: Gold Dragon 22.11.2005, 09:41
выборка осуществляется только по одной таблице kabak в обеех вариантах...
и ещё не понятно, почему WHERE 1, от куда он знает что поиск идёт именно по index?

Автор: Gold Dragon 22.11.2005, 09:43
на всякий случай прикрепляю дамп таблиц

Автор: Kesh 22.11.2005, 11:30
Red Dragon ох ты и намудрил... smile Index - то для чего вообще нужен?
Вечером постараюсь скачать дамп и проверить... Только у меня мускул 5.0.15...

Автор: Gold Dragon 22.11.2005, 11:40
здрасть... а как мне тогда определить какие записи публиковать , а какие ещё нет

Автор: Gold Dragon 22.11.2005, 12:00
всё народ, решилось всё просто, в таблице kabak поле index было с русской буквой Е smile

код у меня в конечном итоге получился
Код

(SELECT name_kabak 
    FROM `kabak` 
    WHERE `index`=1 
    ORDER BY `name_kabak`) 
UNION 
(SELECT name_kabak 
    FROM `comment` 
    WHERE `index`=1 
    ORDER BY `name_kabak`) 
ORDER BY `name_kabak`

всем спасибо за помощь и за мучения

Автор: Akina 22.11.2005, 12:38
1) не совместятся дубли - будет по 2 записи.
2) внеутренние сортировки-то зачем?

Автор: Gold Dragon 22.11.2005, 12:47
Цитата(Akina @ 22.11.2005, 12:38)
1) не совместятся дубли - будет по 2 записи.

почему? у меня по одной записи

Цитата(Akina @ 22.11.2005, 12:38)
2) внеутренние сортировки-то зачем?
а фиг знает smile убрал

Автор: Kesh 22.11.2005, 14:51
Цитата(Red @ 22.11.2005, 12:47)
Цитата (Akina @ 22.11.2005, 12:38)
1) не совместятся дубли - будет по 2 записи.

почему? у меня по одной записи

Так а что ж ты молчал?... smile

Автор: Gold Dragon 22.11.2005, 15:21
народ, вы очём вообще?

Автор: Kesh 22.11.2005, 16:16
Red Dragon Да выбрать Distinct из двух таблиц, если там записи не повторяются - проще простого...
Мы-то заморачивались на тему повторения значения в обеих таблицах...

Автор: Gold Dragon 22.11.2005, 16:37
Цитата(Red @ 19.11.2005, 14:13)
только в первой значение индивидуально, а во второй одно и то же значение может встречаться несколько раз.

+ и в первой и во второй могут встречаться одинаковые значения

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)