Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Вопрос по выборке из двух таблиц

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
avtor.fox
Отправлено: 10 Октября, 2012 - 10:56:55
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2083
Дата рег-ции: Март 2012  
Откуда: Воронеж


Помог: 50 раз(а)




День добрый.

CODE (SQL):
скопировать код в буфер обмена
  1. SELECT *
  2. FROM
  3.         `sv_ticket`
  4. LEFT JOIN
  5.         `sv_ticket_entry` ON (sv_ticket_entry.`tid` = sv_ticket.`id`)
  6. WHERE
  7.         sv_ticket_entry.`tid` = sv_ticket.`id`
  8. GROUP BY
  9.         sv_ticket.`id`


sv_ticket -

CODE (htmlphp):
скопировать код в буфер обмена
  1. id|-|-|-|
  2. 1|test|-|-|
  3. 2|test2|-|-|


sv_ticket_entry -

CODE (htmlphp):
скопировать код в буфер обмена
  1. id|tid|text|-|-|
  2. 1|1|test|-|-|
  3. 2|1|test2|-|-|
  4. 3|1|test3|-|-|
  5. 4|2|test|-|-|
  6. 5|2|test2|-|-|


Связь между таблицами по sv_ticket.id.
Делаю запрос на выборку данных из таблицы sv_ticket, при этом нужно подхватить соответствующую строку из таблицы sv_ticket_entry (sv_ticket_entry.tid = sv_ticket.id), но только одну строку, самую первую.

Корректна ли выборка представленная выше?
(она работает, но так как я не силён в SQL имеются сомнения).
Спасибо Улыбка
 
 Top
EuGen Администратор
Отправлено: 10 Октября, 2012 - 11:12:24
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




avtor.fox пишет:
Корректна ли выборка представленная выше?

Выборка использует эффект обработки группировки MySQL - а именно возможность групировать даже по полям, которые не входят в группу агрегации. В этом случае, вообще говоря, нет гарантии, что выберется именно первая строка. Правильнее выразиться, что выберется "какая попало". Но как правило, попадает строка с наименьшим _ROWID.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
avtor.fox
Отправлено: 10 Октября, 2012 - 11:19:51
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2083
Дата рег-ции: Март 2012  
Откуда: Воронеж


Помог: 50 раз(а)




EuGen
Спасибо.

Данный запрос составлял я сам, по примерам из мануала (более-менее понятно).
Но вот с выборкой по наименьшему id из таблицы sv_ticket_entry я пришёл в тупик.
(Добавление)
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT
  2.         sv_ticket.*,
  3.         sv_ticket_entry.text
  4. FROM
  5.         `sv_ticket`
  6. LEFT JOIN
  7.         `sv_ticket_entry` ON (sv_ticket_entry.`tid` = sv_ticket.`id`)
  8. WHERE
  9.         sv_ticket_entry.`tid` = sv_ticket.`id`
  10. AND
  11.         sv_ticket.close = 0
  12. AND
  13.         sv_ticket_entry.`id` = (
  14.                 SELECT MIN(`id`)
  15.                 FROM `sv_ticket_entry`
  16.                 WHERE sv_ticket_entry.`tid` = sv_ticket.`id`
  17.         )

Вот Закатив глазки
Работает, но опять вызывает сомнения. Можно ли написать короче (правильней?) данный запрос?
 
 Top
EuGen Администратор
Отправлено: 10 Октября, 2012 - 12:06:01
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Подозреваю, что в EXPLAIN Вы увидите DEPENDED SUBQUERY, что является одним из худших вариантов.
Не могу привести точную ссылку, но Вам вполне подойдет GROUP BY, так как Вам нужен минимальный id. Поскольку _ROWID совпадает с первичным ключом (определенным у Вас по полю id), то вариант с группировкой должен всегда давать корректные результаты.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
avtor.fox
Отправлено: 10 Октября, 2012 - 12:16:43
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2083
Дата рег-ции: Март 2012  
Откуда: Воронеж


Помог: 50 раз(а)




Угу, DEPENDENT SUBQUERY имеется.
Спасибо за помощь Улыбка
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Работа с СУБД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB