Автор Тема: глючный запрос  (Прочитано 3158 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн gigauser

  • Статский советник
  • *****
  • Сообщений: 976
  • Репутация: 20
  • Banned
глючный запрос
« : ѕЪвпСам 17, 2008, 05:14:08 pm »
Народ, сервер отказывается со мной разговаривать, когда я ему делаю запрос типа
SELECT product_id,
(SELECT product_id FROM `jos_vm_product` B where A.product_id <> B.product_id order by RAND() LIMIT 1 ) as f,
(SELECT product_id FROM `jos_vm_product` C where A.product_id <> C.product_id AND f<>C.product_id order by RAND() LIMIT 1 ) as s,
(SELECT product_id FROM `jos_vm_product` D where A.product_id <> D.product_id AND D.product_id <> s
AND D.product_id <> f
order by RAND() LIMIT 1 ) as t
FROM `jos_vm_product` A
О_о
причем, если убрать
(SELECT product_id FROM `jos_vm_product` D where A.product_id <> D.product_id AND D.product_id <> s
 AND D.product_id <> f
 order by RAND() LIMIT 1 ) as t
 FROM `jos_vm_product` A
 
то с тормозами, но выполняется, че за дела?о_О
нужно короче для каждого product_id выбрать другие 3 product_id, не совпадающие между собой и с первым
Banned

Оффлайн aureliano

  • Надворный советник
  • *****
  • Сообщений: 400
  • Репутация: 19
Re: глючный запрос
« Ответ #1 : ѕЪвпСам 17, 2008, 05:58:47 pm »
Народ, сервер отказывается со мной разговаривать, когда я ему делаю запрос типа

Я не силён в SQL, но судя по коду в голову приходят 2 объяснения:

1. Сервер имеет ограничение на длину запроса/длину выражения в запросе.

2. Совсем бредовое, но вдруг: в последнем выражении в сравнении алиасы (f, s) стоят справа, а в предпоследнем слева от оператора сравнения на неравенство. Может порядок имеет значение в данной конкретной реализации?

В любом случае имхо правильнее указать, какой сервер и какая версия его используется (я-то всё равно ничего нового не скажу, а кто-то, может, и скажет).

то с тормозами, но выполняется, че за дела?о_О
нужно короче для каждого product_id выбрать другие 3 product_id, не совпадающие между собой и с первым

А почему не сделать простой запрос, чтоб тормозов меньше было?
SELECT product_id FROM `jos_vm_product`дальше их всех в массив, уже там (в массиве, в смысле в программе/скрипте/что там у тебя, но не в запросе) вызывается rand() и каждому id ставятся в соответствие 3 других гарантированно разных id? Может это и не ускорит, но, имхо, попробовать стоит.

Оффлайн gigauser

  • Статский советник
  • *****
  • Сообщений: 976
  • Репутация: 20
  • Banned
Re: глючный запрос
« Ответ #2 : ѕЪвпСам 17, 2008, 06:34:10 pm »
А почему не сделать простой запрос, чтоб тормозов меньше было?
если честно лениво писать то, что может за меня мускул)
убрал пару сравений и заработало, вероятность совпадения все равно маленькая, наплевать;)
Banned

Оффлайн #535

  • Действительный статский советник
  • *****
  • Сообщений: 1794
  • Репутация: 38
  • Пол: Мужской
  • Make scene,not war!
Re: глючный запрос
« Ответ #3 : ѕЪвпСам 17, 2008, 06:55:43 pm »
Цитировать
причем, если убрать

      (SELECT product_id FROM `jos_vm_product` D where A.product_id <> D.product_id AND D.product_id <> s

      AND D.product_id <> f

      order by RAND() LIMIT 1 ) as t

      FROM `jos_vm_product` A      
то с тормозами, но выполняется, че за дела?о_О

нужно короче для каждого product_id выбрать другие 3 product_id, не совпадающие между собой и с первым

А как он вообще тогда интерпретирует A? o_O
Или ты имел ввиду последний SELECT?
« Последнее редактирование: ѕЪвпСам 17, 2008, 06:57:32 pm от #535 »


Оффлайн gigauser

  • Статский советник
  • *****
  • Сообщений: 976
  • Репутация: 20
  • Banned
Re: глючный запрос
« Ответ #4 : ѕЪвпСам 17, 2008, 07:34:19 pm »
Или ты имел ввиду последний SELECT?
захватил лишнюю строчку, виноват)
да, без третьего селекта, который as t
Banned

Оффлайн aureliano

  • Надворный советник
  • *****
  • Сообщений: 400
  • Репутация: 19
Re: глючный запрос
« Ответ #5 : ѕЪвпСам 17, 2008, 07:38:42 pm »
Народ, сервер отказывается со мной разговаривать, когда я ему делаю запрос типа
SELECT product_id,
(SELECT product_id FROM `jos_vm_product` B where A.product_id <> B.product_id order by RAND() LIMIT 1 ) as f,
(SELECT product_id FROM `jos_vm_product` C where A.product_id <> C.product_id AND f<>C.product_id order by RAND() LIMIT 1 ) as s,
(SELECT product_id FROM `jos_vm_product` D where A.product_id <> D.product_id AND D.product_id <> s
AND D.product_id <> f
order by RAND() LIMIT 1 ) as t
FROM `jos_vm_product` A

Странно, создал таблицу
Цитировать
mysql> select * FROM jos_vm_product;
+------------+
| product_id |
+------------+
|          1 |
|          2 |
|          3 |
|          4 |
|          5 |
|          6 |
|          7 |
|          8 |
|          9 |
|         10 |
|         11 |
+------------+
11 rows in set (0.00 sec)

Скопировал запрос, и всё прошло на ура, только неправильно: 2-е, 3-е и 4-е поля гарантированно не совпадают только с первым, а между собой могут быть равны. Наверно где-то в логике запроса ошибка:

Цитировать
mysql> SELECT product_id,
    -> (SELECT product_id FROM `jos_vm_product` B where A.product_id <> B.product_id order by RAND() LIMIT 1 ) as f,
    -> (SELECT product_id FROM `jos_vm_product` C where A.product_id <> C.product_id AND f<>C.product_id order by RAND() LIMIT 1 ) as s,
    -> (SELECT product_id FROM `jos_vm_product` D where A.product_id <> D.product_id AND D.product_id <> s
    -> AND D.product_id <> f
    -> order by RAND() LIMIT 1 ) as t
    -> FROM `jos_vm_product` A;
+------------+------+------+------+
| product_id | f    | s    | t    |
+------------+------+------+------+
|          1 |    2 |    6 |    5 |
|          2 |    7 |   10 |   11 |
|          3 |    2 |    4 |    2 |
|          4 |   11 |   11 |    6 |
|          5 |    9 |   11 |    7 |
|          6 |    1 |    2 |   11 |
|          7 |    8 |    3 |    3 |
|          8 |    6 |    7 |    9 |
|          9 |    7 |    8 |    8 |
|         10 |   11 |    1 |   11 |
|         11 |    5 |    6 |    8 |
+------------+------+------+------+
11 rows in set (0.07 sec)

Так что в плане синтаксиса всё чисто. Остаётся 2 варианта: либо при большой таблице (намного большей, чем мои 11 записей), MySQL начинает тормозить, а когда время обработки сложного запроса достигает максимума, просто возвращает ошибку, либо у тебя кривая версия. У меня mysql  Ver 14.12 Distrib 5.0.45, for mandriva-linux-gnu (i586) using readline 5.2, хотя это неважно, т. к. у меня твой запрос хоть и выполняется, но не так, как задумано.

Оффлайн gigauser

  • Статский советник
  • *****
  • Сообщений: 976
  • Репутация: 20
  • Banned
Re: глючный запрос
« Ответ #6 : ѕЪвпСам 17, 2008, 07:52:16 pm »
начал подозревать, что хостинг (РБК) подвисает
++ за найденную ошибку, только не могу понять, почему не работаетО_о
Banned

Оффлайн aureliano

  • Надворный советник
  • *****
  • Сообщений: 400
  • Репутация: 19
Re: глючный запрос
« Ответ #7 : ѕЪвпСам 20, 2008, 06:03:47 pm »
Ну как? Решил проблему или забил, положившись на теорию вероятностей?

Оффлайн gigauser

  • Статский советник
  • *****
  • Сообщений: 976
  • Репутация: 20
  • Banned
Re: глючный запрос
« Ответ #8 : ѕЪвпСам 20, 2008, 10:23:29 pm »
да не, даже при 300-тах записях наблюдаются совпадения, хотелось изящно - в один запрос. Я как обычно, сначала начну делать, потом подумаю:

SELECT product_id FROM `jos_vm_product` where product_id <> Заданныйproduct_id group by(product_id) ORDER BY RAND() LIMIT 3

для каждого product_id вызываем этот запрос и усе:) и работает быстрее гораздо.

ПС: а сервак тупил изза хостера, домен уже 2 дня недоступен, короче РБК - это шлак.
Banned

Оффлайн aureliano

  • Надворный советник
  • *****
  • Сообщений: 400
  • Репутация: 19
Re: глючный запрос
« Ответ #9 : ѕЪвпСам 21, 2008, 01:23:12 am »
SELECT product_id FROM `jos_vm_product` where product_id <> Заданныйproduct_id group by(product_id) ORDER BY RAND() LIMIT 3

Да. Всё гениальное просто. :-)