SELECT SQL_CALC_FOUND_ROWS * FROM `cpu`,`matherboard`,`ram`,`video`,`hdd`,`form`
WHERE (`matherboard`.`socket`=`cpu`.`socket`)
AND (`matherboard`.`t_ram`=`ram`.`t_ram`)
AND (`matherboard`.`t_video`=`video`.`t_video`)
AND (`matherboard`.`t_rom`=`hdd`.`t_rom`)
AND (`matherboard`.`t_form`=`form`.`t_form`) limit 20
Запрос пришлось организовать таким образом, чтобы выборка происходила из нескольких таблиц одновременно.
Спустя 7 минут, 34 секунды (16.03.2011 - 18:43) sharki написал(а):
Ну во первых надо прописывать вручную каждое поле, которое нужно
SELECT SQL_CALC_FOUND_ROWS * FROM не так, а так SELECT SQL_CALC_FOUND_ROWS `id`.`ram`, `tag`.`vidio` FROM.... в этом духе
и наверное надо группировать запрос так, чтобы были как бы миниподзапросы одного запроса. Но с этим я не могу сейчас помочь..с написанием правильно кода =_
SELECT SQL_CALC_FOUND_ROWS * FROM не так, а так SELECT SQL_CALC_FOUND_ROWS `id`.`ram`, `tag`.`vidio` FROM.... в этом духе
и наверное надо группировать запрос так, чтобы были как бы миниподзапросы одного запроса. Но с этим я не могу сейчас помочь..с написанием правильно кода =_
Спустя 6 минут, 16 секунд (16.03.2011 - 18:50) minok94 написал(а):
Исправил, теперь запрос выглядит так:
При выполнении комп повис и неотзывался около 10 мин...
SELECT SQL_CALC_FOUND_ROWS `cpu`.`id`,`cpu`.`title`,`cpu`.`promo`,`cpu`.`man`,`cpu`.`socket`,`cpu`.`index`,`cpu`.`kernel`,`cpu` .`rec`,`cpu`.`money`,
`matherboard`.`id`,`matherboard`.`title`,`matherboard`.`promo`,`matherboard`.`man`,`matherboard`.`so cket`,`matherboard`.`t_form`,`matherboard`.`t_ram`,`matherboard`.`t_rom`,
`matherboard`.`t_video`,`matherboard`.`index`,`matherboard`.`rec`,`matherboard`.`money`,
`ram`.`id`,`ram`.`title`,`ram`.`promo`,`ram`.`man`,`ram`.`t_ram`,`ram`.`value`,`ram`.`index`,`ram`.` rec`,`ram`.`money`,
`video`.`id`,`video`.`title`,`video`.`promo`,`video`.`man`,`video`.`t_video`,`video`.`value`,`video` .`type`,`video`.`index`,`video`.`rec`,`video`.`money`,
`hdd`.`id`,`hdd`.`title`,`hdd`.`promo`,`hdd`.`man`,`hdd`.`t_rom`,`hdd`.`value`,`hdd`.`index`,`hdd`.` rec`,`hdd`.`money`,
`form`.`id`,`form`.`title`,`form`.`promo`,`form`.`man`,`form`.`t_form`,`form`.`size`,`form`.`index`, `form`.`rec`,`form`.`money` FROM `cpu`,`matherboard`,`ram`,`video`,`hdd`,`form`
WHERE (`matherboard`.`socket`=`cpu`.`socket`)
AND (`matherboard`.`t_ram`=`ram`.`t_ram`)
AND (`matherboard`.`t_video`=`video`.`t_video`)
AND (`matherboard`.`t_rom`=`hdd`.`t_rom`)
AND (`matherboard`.`t_form`=`form`.`t_form`) limit 20
При выполнении комп повис и неотзывался около 10 мин...
Спустя 10 минут, 51 секунда (16.03.2011 - 19:00) sharki написал(а):
фига запрос...щас придут Гуру и помогут =) подожди малек
Спустя 7 секунд (16.03.2011 - 19:01) Семён написал(а):
SQL_CALC_FOUND_ROWS не используй это.
На больших таблицах будут жуткие тормоза! Быстрее сделать 2-ой SELECT. + какое у тебя кол-во данных? покажи EXPLAIN у запроса
На больших таблицах будут жуткие тормоза! Быстрее сделать 2-ой SELECT. + какое у тебя кол-во данных? покажи EXPLAIN у запроса
Спустя 4 минуты, 55 секунд (16.03.2011 - 19:05) minok94 написал(а):
Спасибо, не буду SQL_CALC_FOUND_ROWS использовать, но при выполнении запроса комп виснет.
Спустя 1 минута, 13 секунд (16.03.2011 - 19:07) Семён написал(а):
Цитата (minok94 @ 16.03.2011 - 20:05) |
Спасибо, не буду SQL_CALC_FOUND_ROWS использовать, но при выполнении запроса комп виснет. |
У тебя какое кол-во данных? Расставлены индексы на колонках по которым проходит выборка (WHERE) поставь перед SELECT слово EXPLAIN и выведи то что тебе выдаст запрос.
Спустя 32 минуты, 26 секунд (16.03.2011 - 19:39) minok94 написал(а):
Запрос не прошел, по этому попробовал набрать в phpmyadmin, результат на скрине:
Спустя 2 часа, 24 минуты, 18 секунд (16.03.2011 - 22:03) Snus написал(а):
SELECT COUNT(*)
FROM `matherboard`
INNER JOIN `cpu` ON cpu.socket = matherboard.socket
INNER JOIN `ram` ON ram.t_ram = matherboard.t_ram
INNER JOIN `video` ON video.t_video = matherboard.t_video
INNER JOIN `rom` ON rom.t_rom = matherboard.t_rom
INNER JOIN `form` ON form.t_form = matherboard.t_form
Спустя 18 минут, 54 секунды (16.03.2011 - 22:22) Trianon написал(а):
Snus
Верно, так более красиво и понятно.
Но пока человек не начнет применять ключи для связи таблиц и строить индексы на ключевых полях, это всё мертвому припарки.
Верно, так более красиво и понятно.
Но пока человек не начнет применять ключи для связи таблиц и строить индексы на ключевых полях, это всё мертвому припарки.
Спустя 3 минуты, 51 секунда (16.03.2011 - 22:26) Snus написал(а):
Вот так правильнее кагбэ :)
А на cpu, ram, video, rom и form ID должен иметь первичный ключ с автоинкрементом.
SELECT COUNT(*)
FROM `matherboard` AS `db`
INNER JOIN `cpu` ON cpu.id = db.socket
INNER JOIN `ram` ON ram.id = db.t_ram
INNER JOIN `video` ON video.id = db.t_video
INNER JOIN `rom` ON rom.id = db.t_rom
INNER JOIN `form` ON form.id = db.t_form
А на cpu, ram, video, rom и form ID должен иметь первичный ключ с автоинкрементом.
Спустя 6 минут, 10 секунд (16.03.2011 - 22:32) Trianon написал(а):
так наверняка ж в этих socket, t_ram и прочих t_* лежат человеческие названия, а не суррогатные ключи.
А значит все эти таблицы придется модифицировать.
А значит все эти таблицы придется модифицировать.
Спустя 6 часов, 24 минуты, 57 секунд (17.03.2011 - 04:57) minok94 написал(а):
Всем спасибо, запрос действительно выглядит правильней и скорость выборки возросла в несколько раз.