Правила     Закладки     Карма    Календарь    Журналы    Помощь    Поиск    PDA    Чат   
        СМС-ки
   
Пейджер выключен!
Страницы: (2) [1] 2  ( Перейти к первому непрочитанному сообщению )  
Фильтр авторов:    показать 
  скрыть
  Ответ в темуСоздание новой темыСоздание опроса

> Limit в подзапросе
Kusss  
 ۩  Дата
Цитировать сообщение

Пользователь сейчас на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1528
Пользователь №: 28976
На форуме: 5 лет, 10 месяцев
Карма: 91




SELECT 
o.*
FROM
`order_product` AS o
WHERE
o.order_id IN (
SELECT id
FROM `order`
WHERE `finish` =0
LIMIT 0,30
)

Ругается
Цитата
#1235 - This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
bestxp  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



орангутанг
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 2059
Пользователь №: 36605
На форуме: 4 года, 3 месяца, 13 дней
Карма: 113




ну думаю стоит обновить MySQL как вариант?


--------------------
PMПисьмо на e-mail пользователюСайт пользователяICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Kusss  
 ۩  Дата
Цитировать сообщение

Пользователь сейчас на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1528
Пользователь №: 28976
На форуме: 5 лет, 10 месяцев
Карма: 91




Текущая версия MySQL: 5.5
Можно заказать от 5.3 до 5.6
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
redreem  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 4284
Пользователь №: 29002
На форуме: 5 лет, 9 месяцев, 28 дней
Карма: 147




SELECT 
o.*
FROM
`order_product` AS o
WHERE
o.order_id IN (
select * from (
SELECT id
FROM `order`
WHERE `finish` =0
LIMIT 0,30
) as `id`
)

PMПисьмо на e-mail пользователю
    1   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Kusss  
 ۩  Дата
Цитировать сообщение

Пользователь сейчас на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1528
Пользователь №: 28976
На форуме: 5 лет, 10 месяцев
Карма: 91




redreem
Спасибо, работает.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
twin  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Глухой нуб
******

Профиль
Группа: Администратор
Почтальон группы
Сообщений: 16109
Пользователь №: 6543
На форуме: 8 лет, 7 месяцев, 26 дней
Карма: 303

Трезвый :
6 лет, 5 месяцев, 4 дня


А для чего лимит в подзапросе? Это никакой экономии не даст. Особенно когда еще один подзапрос добавили.

Так чем не устроило?
SELECT 
o.*
FROM
`order_product` AS o
WHERE
o.order_id IN (
SELECT id
FROM `order`
WHERE `finish` =0
)
LIMIT 0 , 30


--------------------
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
PMСайт пользователяICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Kusss  
 ۩  Дата
Цитировать сообщение

Пользователь сейчас на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1528
Пользователь №: 28976
На форуме: 5 лет, 10 месяцев
Карма: 91




twin
Твой запрос вернет не 30 заказов , а 30 позиций. Если в заказе будет скажем по 8 позиций, то вернется 4 заказа. Причем один будет не полным.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
twin  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Глухой нуб
******

Профиль
Группа: Администратор
Почтальон группы
Сообщений: 16109
Пользователь №: 6543
На форуме: 8 лет, 7 месяцев, 26 дней
Карма: 303

Трезвый :
6 лет, 5 месяцев, 4 дня


Понятно. Особо не вникал, потому что я бы изначально так не делал. Ну если только ресурсы не важны. Это очень тяжелый запрос получается. Совсем не такой, как кажется на первый взгляд.

Оптимизировать его лениво, ибо не вижу смысла. Я бы решал двумя атомарными запросами.

Если не в курсе, почему тяжелый запрос, могу рассказать.


--------------------
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
PMСайт пользователяICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Kusss  
 ۩  Дата
Цитировать сообщение

Пользователь сейчас на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1528
Пользователь №: 28976
На форуме: 5 лет, 10 месяцев
Карма: 91




Вроде не долго выполняется
Отображает строки 0 - 29 ( 60 всего, Запрос занял 0.0483 сек.)

Но я все же разбил на 2 запроса.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
twin  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Глухой нуб
******

Профиль
Группа: Администратор
Почтальон группы
Сообщений: 16109
Пользователь №: 6543
На форуме: 8 лет, 7 месяцев, 26 дней
Карма: 303

Трезвый :
6 лет, 5 месяцев, 4 дня


Наверное таблицы небольшие. Вообще это серьёзная ошибка, делать вложенные запросы такого плана. Они оправданы только в редких случаях, когда не важен ресурс. В админке к примеру. Потому что с листа кажется, что сначала отработает внутренний запрос, потом результат подставится во внешний IN().

На самом деле это не так. Потому и LIMIT не работает.
Интерпретатор преобразует такой запрос к примерно такому виду
SELECT o. * 
FROM `order_product` AS o
WHERE EXISTS (
SELECT 1
FROM `order` AS a
WHERE a.`finish` =0
AND o.order_id = a.id

)
и будет сравнивать все значения o.order_id с a.id. То есть будет выполнено не сложение, а умножение. Причем внешнего на внутренний. Если в таблице `order_product` 1000 строк, а в `order` 50 то будет выполнено не 30 (если была бы возможность лимита или с еще одним запросом, как у redreem), и даже не 50, как без него, а 50000 "внутренних запросов" в худшем случае. Там немного не так, EXISTS прекращает поиск при первом совпадении, но не известно откуда он начнет считать.

Если данных немного, то незаметно. Если много и посещаемость большая - стоит задуматься.
Два разных запроса тут намного выгоднее.


--------------------
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
PMСайт пользователяICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
icedfox  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 396
Пользователь №: 41702
На форуме: 1 год, 9 месяцев, 15 дней
Карма: 13




LEFT JOIN тут разве не подойдет ? или я ошибаюсь ?
PM
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
twin  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Глухой нуб
******

Профиль
Группа: Администратор
Почтальон группы
Сообщений: 16109
Пользователь №: 6543
На форуме: 8 лет, 7 месяцев, 26 дней
Карма: 303

Трезвый :
6 лет, 5 месяцев, 4 дня


А смысл тот же. И механизмы похожи.


--------------------
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
PMСайт пользователяICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
icedfox  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 396
Пользователь №: 41702
На форуме: 1 год, 9 месяцев, 15 дней
Карма: 13




Цитата (twin @ 18.02.2016 - 00:28)
А смысл тот же. И механизмы похожи.

Вот это даже не знал. Я правильно понимаю, что JOIN запросы оправданны с таблицами до 1к значений примерно и лучше бить на несколько разных ?
PM
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
twin  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Глухой нуб
******

Профиль
Группа: Администратор
Почтальон группы
Сообщений: 16109
Пользователь №: 6543
На форуме: 8 лет, 7 месяцев, 26 дней
Карма: 303

Трезвый :
6 лет, 5 месяцев, 4 дня


Всё зависит от условий. Но вообще при highload лучше избегать вложенных и составных запросов. Все таки БД, это самое узкое место приложения.


--------------------
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
PMСайт пользователяICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Kusss  
 ۩  [x] Дата
Цитировать сообщение

Пользователь сейчас на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1528
Пользователь №: 28976
На форуме: 5 лет, 10 месяцев
Карма: 91




Да, это в админке. И обновляется не часто
вот оригинал конструкции, который был
SELECT 
o.order_id AS id, o.number, o.print_num, o.board,
o.id_product, o.size, o.color, p.pol,
ko.date, ko.name,
ac.print , ac.text
FROM
`order_product` AS o
LEFT JOIN
`product` AS p ON p.id = o.id_product
LEFT JOIN
`order` AS ko ON ko.id = o.order_id
LEFT JOIN
`order_comment` AS ac ON ac.id_order = o.order_id
WHERE
o.live = 0 AND
o.order_id IN (
SELECT * FROM
(
SELECT o2.id
FROM `order` AS o2
LEFT JOIN `order_comment` AS ac2 ON ac2.id_order = o2.id
WHERE o2.finish = 0 AND ac2.print >= 1 AND ac2.print < 3
ORDER BY o2.id DESC
LIMIT
$c,$str_index
) AS `id`
)
ORDER BY
o.order_id DESC,
ac.print,
ko.date DESC

стало
SELECT 
o.id, o.date, o.name, o.city,
ac.print , ac.text, ac.date_out
FROM
`order` AS o
LEFT JOIN
`order_comment` AS ac ON ac.id_order = o.id
WHERE
o.finish = 0 AND
ac.print >= 1 AND
ac.print < 3
ORDER BY
o.id DESC
LIMIT

$c,$str_index
и

SELECT
o.order_id AS id, o.number, o.print_num, o.board,
o.id_product, o.size, o.color, p.pol
FROM
`order_product` AS o
LEFT JOIN
`product` AS p ON p.id = o.id_product
WHERE
o.live = 0 AND
o.order_id IN (".implode(',', $select).")


Это сообщение отредактировал Kusss - 17.02.2016 - 22:58
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
  Быстрый ответ
Информация о Госте
Введите Ваше имя
Кнопки кодов
Для вставки цитаты, выделите нужный текст и
НАЖМИТЕ СЮДА
Введите сообщение
Смайлики
:huh:  :o  ;) 
:P  :D  :lol: 
B)  :rolleyes:  <_< 
:)  :angry:  :( 
:unsure:  :blink:  :ph34r: 
     
Показать всё

Опции сообщения  Включить смайлики?
 Включить подпись?
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темыСтраницы: (2) [1] 2  Ответ в темуСоздание новой темыСоздание опроса