Помогите составить запрос...

mike

pmcoder
Помогите составить запрос...

Есть 2 таблицы:

a_id | a_owner | a_data

    1     2        ...
    2     3         ...
    3     1         ...
    4     5         ...    
    5     4         ...
     ...       ...       ...
 

user_id | user_company
    1     2
    2     3
    3     4
    4     3
    5     5

 
a_owner - внешний ключ на user_id.

Нужно из таблицы "а" выбрать все записи для всех user_id имеющих одинаковый user_company по заданому "user_id".

Например: user_id=2
Результат:
a_id | a_owner | a_data | user_id | user_company
     1      2         ...           2             3
     5      4         ...           4             3   

Такой же результат будет для user_id=4

P.S. Итак и эдак, ну никак... :confused:
 

tf

крылья рулят
5 5
a_owner - внешний ключ на user_id.
больше на фокс похоже (либо на другую подобную систему) чем на пхп,
если есть возможность я бы там запросы и тестил

вродебы это:
SELECT id FROM `links`WHERE section_id= (
SELECT section_id FROM `links_sections` WHERE id=5)
 

mike

pmcoder
Насколько я знаю MySql не поддерживает вложенные запросы, что было бы неплохо и у меня не возникало бы подобных вопросов.
 

tf

крылья рулят
Насколько я знаю MySql не поддерживает вложенные запросы, что было бы неплохо и у меня не возникало бы подобных вопросов.
поддерживают www.mysql.ru/docs/gruber/mg10.html

дого того как наткнулся на твой вопрос и я думал что mysql не поддерживает внешние ключи, возможно я ошибался www.mysql.ru/docs/gruber/mg19.html
 

mike

pmcoder
я думал что mysql не поддерживает внешние ключи
Он их и не поддерживает. Но это не значит, что нельзя пользоваться логикой внешних ключей.
Я использовал данный термин, чтобы объяснить связь между таблицами.
 

tf

крылья рулят
ясно,
SELECT помог? или я опять не так понял
 

mike

pmcoder
По поводу вложенного запроса.
Да, я слышал, что новые версии MySql поддерживают вложенные запросы. Но версия с которой работаю я
их не поддерживает.

-~{}~ 12.08.05 12:11:

Мне нужен вариант с объединениями.

-~{}~ 12.08.05 12:14:


tf
Кстати статья называется "ВВЕДЕНИЕ В SQL" а не в MySql
 

tf

крылья рулят
тогда так
SELECT a.id,a.section_id FROM `links`a, `links_sections` b WHERE b.id=15 AND a.section_id=b.id;
лучшеб привел CREATE table на моих зависимых работает
 

mike

pmcoder
tf
Ты не мог бы писать те названия столбцов, которые использовалить в вопросе?

Опишу задачу чел языком. Есть таблица сообщений "а" Сообщения создают пользователи системы "user_id". Пользователи работают в разных компаниях "user_company". В одной компании может работать несколько пользователей. "a_owner" это владелец сообщения, то есть "user_id". Мне нужно для конкретного "user_id" увидеть его сообщения и сообщения всех "user_id", которые работают в его компании.

Можно задачу решить в 2 запроса:

1. SELECT user_company WHERE user_id = "ТРЕБУЕМЫЙ ЮЗЕР"
2. SELECT * FROM a LEFT JOIN user ON a_owner=user_id
WHERE user_company = (user_company с первого запроса)

Меня же интересут решение одним запросом с одним аргументом user_id.
 

tf

крылья рулят
н.да
Ты не мог бы писать те названия столбцов, которые использовалить в вопросе?
приведи дамп таблиц на сухой теории трудновато ответить
 

mike

pmcoder
приведи дамп таблиц
Смотри в вопросе. Там есть пример данных и пример результата запроса.
tf, если ты не понял задачу, после моего предыдущего поста, то скорей всего ты мне не поможеш.
на сухой теории
построена тема
а мой предыдущий пост построен на самой что ни на есть мокрой практике.
 

tf

крылья рулят
все люди разные одним хватает словесного объяснения, другим (мне) для более быстрого понимания необходим код (кторый можно было пошупать:
CREATE TABLE `links` (
`id` int(10) unsigned NOT NULL auto_increment,
`section_id` smallint(5) unsigned NOT NULL default '0',
....
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=koi8r;
CREATE TABLE `links_sections` (
`id` smallint(5) unsigned NOT NULL auto_increment,
....
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=koi8r;

мне для вклинивания со слов потребуется больше времени (да и желания) которго уже нет
ищи в мануале там есть
 

Profic

just Profic (PHP5 BetaTeam)
А толку. В твоей кастрированной муське этого одним запросом не сделаешь (имхо, по крайней мере я при неизвестном числе повторений не придумал). Потому используй два запроса и не парь людям мозг.
 

moxnatiy

Новичок
извини таблицы создавал руками названия свои
a_test - это где a_id и a_owner
b_test - user_id и compaign_id


[sql]
CREATE TABLE `a_test` (
`a_id` int(10) NOT NULL default '0',
`b_id` int(10) NOT NULL default '0',
`data` varchar(10) default NULL,
PRIMARY KEY (`a_id`)
);

CREATE TABLE `b_test` (
`u_id` int(11) NOT NULL default '0',
`c_id` int(11) NOT NULL default '0',
PRIMARY KEY (`u_id`)
);

SELECT a_test.a_id, a_test.b_id, a_test.data
FROM b_test AS user1
LEFT JOIN b_test AS user2 ON user1.c_id = user2.c_id
AND user1.u_id != user2.u_id
LEFT JOIN a_test ON user1.u_id = a_test.b_id
WHERE
user1.u_id =1
OR user2.u_id =1
;

[/sql]
 

chira

Новичок
moxnatiy
по моему не совсем точно
Код:
SELECT DISTINCT u.*, c2.*
FROM table1 u, table2 c1, table2 c2
WHERE c1.user_id = 2
  AND c1.user_company = c2.user_company
  AND c2.user_id = u.a_owner
 

Profic

just Profic (PHP5 BetaTeam)
Все хорошо, но это запрос правилен, только если в таблице два user_id-а с одинаковыми user_company. А если их больше?
Тут имхо два варианта:
1) Тот, который сам mike и предложил.
2) Посчитать кол-во этих повторений, и с помощью php состряпать запрос с объединением таблицы самой с собой нужное кол-во раз. Но это гемморой.
 

moxnatiy

Новичок
Profic
мой запрос и с большим количеством работает
еще фильтр на не пустой a_id поставить и всё заработает
 

mike

pmcoder
moxnatiy
Чесно говоря твой запрос у меня не заработал, но ход твоей мысли мне понравился :) . Я чуток подумал и составил запрос который работает:
PHP:
SELECT a_id...  
  FROM users AS comp LEFT JOIN users AS own ON comp.user_company=own.user_company
                     LEFT JOIN a ON comp.user_id=a_owner
 WHERE own.user_id = "ЮЗЕР"
Я чесно говоря думал о объединении таблицы самой с собой, но т.к. раньше никогда таких запросов не составлял, сомневался...
В любом случае спасибо за помощь.

И еще вопрос: С какой версии MYSQL поддерживает вложенные запросы SELECT и поддерживает ли их вообще?
Где об этом можно почитать?

-~{}~ 22.08.05 11:42:

Profic
2) Посчитать кол-во этих повторений, и с помощью php состряпать запрос с объединением таблицы самой с собой нужное кол-во раз.
С какой целью?
 

moxnatiy

Новичок
mike
почитать тут http://dev.mysql.com/doc/

поддерживает вложенные запросы вроде как с 4.1
 
Сверху