Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

Вопрос о JOIN (collapse)
Author Message
collapse
Участник форума



Joined: 05 Sep 2006
Posts: 78
Карма: 0
   поощрить/наказать


PostPosted: Tue Jan 30, 2007 1:36 pm (написано за 7 минут 49 секунд)
   Post subject: Вопрос о JOIN
Reply with quote

Есть 2 таблицы. В одной хранятся номера в отелях {numbers} в другой (bron) заказы на них.
Нужно выбрать все номера и заказы к ним , причем вместе с теми номерами, на которых нет заказов.

Запрос :
Code (SQL): скопировать код в буфер обмена
SELECT * FROM numbers LEFT JOIN bron ON bron.number=numbers.id
Выдает то что надо.
EXPLAIN
Code (any language): скопировать код в буфер обмена
id         select_type         table         type         possible_keys         key         key_len         ref         rows         Extra
1        SIMPLE        numbers        ALL        NULL        NULL        NULL        NULL        9        
1        SIMPLE        bron        ALL        NULL        NULL        NULL        NULL        4
Но мне нужно выбрать брони за определенный период, скажем так:
Code (SQL): скопировать код в буфер обмена
SELECT numbers.name, numbers.id AS number_id, bron.id AS bron_id, bron.time_in, bron.time_out
FROM numbers
RIGHT JOIN bron ON ( bron.number = numbers.id )
WHERE bron.time_in
BETWEEN 1169893785
AND 1171362585
OR bron.time_out
BETWEEN 1169893785
AND 1171362585
EXPLAIN
Code (any language): скопировать код в буфер обмена
id         select_type         table         type         possible_keys         key         key_len         ref         rows         Extra
1        SIMPLE        bron        ALL        NULL        NULL        NULL        NULL        4        Using where
1        SIMPLE        numbers        eq_ref        PRIMARY        PRIMARY        4        admin2.bron.number        1        Using where
ТО есть мое ограничение WHERE на таблицу bron заставляет MySQL выбирать сначала из неё, а потом уже остатки собирать в numbers.

Как добиться результата?
Может легче делать неск. запросов и обрабатывать их PHP?
Но получается примерно 10 запросов.
БД Mysql 4.x.x
Back to top
View user's profile Send private message
collapse
Участник форума



Joined: 05 Sep 2006
Posts: 78
Карма: 0
   поощрить/наказать


PostPosted: Wed Feb 07, 2007 7:54 pm (спустя 8 дней 6 часов 18 минут; написано за 6 секунд)
   Post subject:
Reply with quote

up
Back to top
View user's profile Send private message
WingedFox
Профессионал



Joined: 29 Apr 2003
Posts: 4064
Карма: 268
   поощрить/наказать

Location: Питер

PostPosted: Wed Feb 07, 2007 8:11 pm (спустя 16 минут; написано за 3 секунды)
   Post subject:
Reply with quote

LEFT JOIN?
Back to top
View user's profile Send private message
Владимир Хоменко
Участник форума



Joined: 11 Jun 2004
Posts: 427
Карма: 42
   поощрить/наказать

Location: Николаев, Украина

PostPosted: Wed Feb 07, 2007 8:20 pm (спустя 8 минут; написано за 1 минуту 28 секунд)
   Post subject:
Reply with quote

Что-то такое ?
Code (SQL): скопировать код в буфер обмена
SELECT
numbers.name, numbers.id AS number_id, bron.id AS bron_id, bron.time_in, bron.time_out
FROM
numbers LEFT JOIN bron
ON (bron.number = numbers.id AND (bron.time_in BETWEEN 1169893785 AND 1171362585 OR bron.time_out BETWEEN 1169893785 AND 1171362585))
Back to top
View user's profile Send private message Send e-mail
collapse
Участник форума



Joined: 05 Sep 2006
Posts: 78
Карма: 0
   поощрить/наказать


PostPosted: Thu Feb 08, 2007 10:37 am (спустя 14 часов 17 минут; написано за 54 секунды)
   Post subject:
Reply with quote

Владимир ХоменкоХм. Да действительно Left Join работает вроде. Я вроде пробывал да не тот результат получал. Спасибо.
Back to top
View user's profile Send private message
Владимир Хоменко
Участник форума



Joined: 11 Jun 2004
Posts: 427
Карма: 42
   поощрить/наказать

Location: Николаев, Украина

PostPosted: Thu Feb 08, 2007 10:49 am (спустя 12 минут; написано за 40 секунд)
   Post subject:
Reply with quote

Еще раз посмотрите отличия в своем запросе и в моем. У Вас условие вынесено в WHERE, у меня в ON. Это важно
Back to top
View user's profile Send private message Send e-mail
Guest






Карма: 388
   поощрить/наказать


PostPosted: Thu Feb 15, 2007 9:01 am (спустя 6 дней 22 часа 11 минут; написано за 11 секунд)
   Post subject:
Reply with quote

Здравствуйте, у меня вроде схожая проблема.
Прошу помощи толкнуть в нужную сторону.

Есть две таблицы t1 и t2

Таблица t1

|id|field_1|field_2|...|...

Таблица t2
|id|t1_id|time|field_1|field_2|...|...

Необходимо два запроса для постраничного вывода результатов.
В первом запросе необходимо получить кол-во записей, во втором получить все данные.

Выборка по следующим условиям.
максимальное значение MAX(t2.time)>N (N - некое время) и t2.t1_id=t1.id
Во втором запросе также необходимо получить кол-во записей из t2 где t2.t1_id=t1.id

Пробовал по разному но всегда возвращает ошибку группировки.
На данный момент получилось сделать только
первый запрос:
Code (any language): скопировать код в буфер обмена
SELECT
COUNT(DISTINCT `t1`.`id`) AS `total`
FROM `t1`
LEFT JOIN `t2` ON `t2`.`t1_id`=`t1`.`id`
WHERE `t2`.`time`>'1171400000'
второй запрос:
Code (any language): скопировать код в буфер обмена
SELECT `t1`.*,
COUNT(DISTINCT `t2`.`id`) AS `t2_total`,
MAX(`t2`.`time`) AS `max`
FROM `t1`
LEFT JOIN `t1` ON `t2`.`t1_id`=`t1`.`id`
WHERE `t2`.`time`>'1171400000' GROUP BY `t1`.`id`  ORDER BY `max`DESC
Но это не устраивает, потому как выдает все записи где t2.time>N, к тому же в t2_total попадают записи в которых t2.time>N
Надеюсь на помощь.
Back to top
Markus
Участник форума



Joined: 02 Feb 2004
Posts: 210
Карма: 3
   поощрить/наказать


PostPosted: Thu Feb 15, 2007 9:03 am (спустя 1 минуту 40 секунд; написано за 19 секунд)
   Post subject:
Reply with quote

Прошу прощения, это я забыл авторизоваться :)
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic All times are GMT + 3 Hours
Page 1 of 1    Email to a Friend.
You cannot post new topics in this forum. You cannot reply to topics in this forum. You cannot edit your posts in this forum. You cannot delete your posts in this forum. You cannot vote in polls in this forum. You cannot attach files in this forum. You can download files in this forum.
XML