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

Raziel[SD]

untitled00
Помогите составить запрос, плз

Помогите составить запрос
Есть 2 таблицы с полями:
TABLE ThreadList (
id INTEGER UNSIGNED PRIMARY KEY AUTO_INCREMENT NOT NULL,
thread_name CHAR(30) NOT NULL,...(еще поля)
TABLE AccessList (
id INTEGER UNSIGNED PRIMARY KEY AUTO_INCREMENT NOT NULL,
user_id INTEGER UNSIGNED NOT NULL,
thread_id INTEGER UNSIGNED NOT NULL,
access_type TINYINT UNSIGNED NULL,....(еще поля)

необходимо выбрать все строки из таблицы ThreadList и соответствующий им 'access_type' из
AccessList, для определенного AccessList.user_id,
т.е. AccessList.thread_id = ThreadList.id и AccessList.user_id=$Некий_ИД :)
При выполнении такого запроса:
Код:
SELECT ThreadList.id AS tid, ThreadList.thread_name AS title, AccessList.access_type AS actype 
FROM ThreadList, AccessList
WHERE  AccessList.thread_id=ThreadList.id AND AccessList.user_id='5' 
ORDER BY title
Если у меня нет в AccessList записи соответствующей ThreadList, то я не получаю значения
ThreadList.thread_name, а мне нужно чтобы оно выбиралось всегда, независимо от того есть
ли в AccessList соответствующая запись. Я так понимаю надо использовать LEFT JOIN, но что-то
у меня не получается :(, или я не в том напрвлении двигался ?
Если что-то непонятно:) написал, спрашивайте.
З.Ы. мдаа, прочитал что я написал, что-то непонятное, но вряд ли лучше получиться :(, где вы ясновидящие, помогите
Заранее спасибо.
 

.des.

Поставил пиво кому надо ;-)
так ответь себе на вопрос - сколько записей вернет тебе этот запрос?
уж куда меньше чем есть ThreadList а ты хочешь выбрать все имена оттуда.. че то я не понимаю зачем тебе это нужно.
Если тебе надо потом просто выбрабть все thread_name то сделай второй запрос
SELECT ThreadList.thread_name FROM ThreadList
Если что то другое, то давай объясняй что ты хочешь в итоге.. а то задача непонятна.
 

Raziel[SD]

untitled00
.des. меня интерисует как составить запрос, чтобы все вместе сразу. я тот запрос запрос привел как пример, надо чтобы выбирал из ThreadList, а если подходит под условие брал AccessList.access_type. Может так понятней :). не умею объяснять :(
З.Ы. спасибо за предложеный вариант, попробую завтра объяснить, что я хочу
 

EkyT

Guest
SELECT ThreadList.id AS tid, ThreadList.thread_name AS title, AccessList.access_type AS actype
FROM ThreadList LEFT JOIN AccessList ON (ThreadList.id = AccessList.thread_id) WHERE AccessList.user_id='5' ORDER BY title

для записей из таблиты ThreadList которые не присутствуют в AccessList поле actype будет NULL
 

Raziel[SD]

untitled00
EkyT, не помогло :(, результат такой же, как и от моего запроса, что то я тогда не пойму как работает LEFT JOIN, т.к. судя по тому как я понял его работу, твой запрос, то что мне нужно, но неработает .... :(
 

Raziel[SD]

untitled00
Yurik, я не понимаю, что ты хочешь сказать.

Вот, может такой пример поможет объяснить, что я хочу :)
вот 2 запроса к базе, с разными AccessList.user_id
для AccessList.user_id=2
---
tid title actype
--- ----- ------
2 Новости 2

(1 row(s) affected)
---
для AccessList.user_id=3
tid title actype
--- ----- ------
2 Новости 2
1 Статьи 1

(2 row(s) affected)
---------------------------------
Я же хочу получить для AccessList.user_id=2, вот такое или похожее
tid title actype
--- ----- ------
2 Новости 2
1 Статьи NULL

(2 row(s) affected)
---------------------------------
вот это может поможет понять, что я хочу.
 

EkyT

Guest
все. я понял.
неверная и порочная связь сгубила нас....

таблица один суть есть тред, таблица 2 суть есть непойми что

выбрать из таблицы 1 _все_ записи которые связаны с таблицей 2 одним полем, указывая в качестве выражения where совсем другое поле, никак не связанное с таблицей 1 _невозможно_

чтобы добиться желаемого результата необходимо в таблицу 1 добавить поле user_id, что вполне логично кстати

тогда для того чтобы выбрать из таблицы 1 _все_ треды для определенного user можно будет вышеописанным мною запросом только связь таблиц должна осуществляться по полю user_id

вот пример:
CREATE TABLE t1 (
id int(10) unsigned NOT NULL auto_increment,
name varchar(30) NOT NULL default '',
PRIMARY KEY (id)
) TYPE=MyISAM;
INSERT INTO t1 VALUES (1,'name1');
INSERT INTO t1 VALUES (2,'name2');
INSERT INTO t1 VALUES (3,'name3');
INSERT INTO t1 VALUES (4,'name4');

CREATE TABLE t2 (
id int(10) unsigned NOT NULL auto_increment,
pid int(10) unsigned NOT NULL default '0',
status int(11) NOT NULL default '1',
PRIMARY KEY (id),
KEY pid (pid)
) TYPE=MyISAM;
INSERT INTO t2 VALUES (1,1,'');
INSERT INTO t2 VALUES (2,1,'');
INSERT INTO t2 VALUES (3,1,'');
INSERT INTO t2 VALUES (4,3,'');
INSERT INTO t2 VALUES (5,3,'');
INSERT INTO t2 VALUES (6,3,'');

select t1.id id, t1.name name, t2.status from t1 left join t2 on(t1.id = t2.pid);
+----+-------+--------+
| id | name | status |
+----+-------+--------+
| 1 | name1 | 0 |
| 1 | name1 | 0 |
| 1 | name1 | 0 |
| 2 | name2 | NULL |
| 3 | name3 | 0 |
| 3 | name3 | 0 |
| 3 | name3 | 0 |
| 4 | name4 | NULL |
+----+-------+--------+
8 rows in set (0.00 sec)

select t1.id id, t1.name name, t2.status from t1 left join t2 on(t1.id = t2.pid) where t1.id=1;
+----+-------+--------+
| id | name | status |
+----+-------+--------+
| 1 | name1 | 0 |
| 1 | name1 | 0 |
| 1 | name1 | 0 |
+----+-------+--------+
3 rows in set (0.00 sec)

select t1.id id, t1.name name, t2.status from t1 left join t2 on(t1.id = t2.pid) where t1.id=2;
+----+-------+--------+
| id | name | status |
+----+-------+--------+
| 2 | name2 | NULL |
+----+-------+--------+
1 row in set (0.00 sec)
 

Raziel[SD]

untitled00
я решил проблему таким способом, может у кого есть проще вариант.
CREATE TEMPORARY TABLE IF NOT EXISTS aList_tmp SELECT * FROM AccessList WHERE user_id=2;

SELECT ThreadList.id AS tid, ThreadList.thread_name AS title, aList_tmp.access_type AS actype
FROM ThreadList LEFT JOIN aList_tmp ON (ThreadList.id =aList_tmp.thread_id)
ORDER BY title;
.....
DROP TABLE aList_tmp;

всем спасибо.
 

chira

Новичок
Это то что тебе нужно:

SELECT ThreadList.id AS tid, ThreadList.thread_name AS title, AccessList.access_type AS actype
FROM ThreadList LEFT JOIN AccessList ON ThreadList.id = AccessList.thread_id AND AccessList.user_id='2'
ORDER BY title
 
Сверху