MYSQL оптимизировать и вопросы - PullRequest
1 голос
/ 18 апреля 2009

Я пытаюсь оптимизировать свои запросы MySQL, и мне нужна помощь. Вот мой текущий запрос:

SELECT *,
       (SELECT name FROM stores WHERE id = products.store_id) AS store_name,
       (SELECT username FROM stores WHERE id = products.store_id) AS store_username,
       (SELECT region_id FROM stores WHERE id = products.store_id) AS region_id,
       (SELECT city_id FROM stores WHERE id = products.store_id) AS city_id,
       (SELECT name FROM categories_sub WHERE id = products.subcategory_id) AS subcategory_name,
       (SELECT name FROM categories WHERE id = category_id) AS category_name
FROM products
WHERE date_start <= DATE(NOW()) AND date_end >= DATE(NOW())

Я почти уверен, что это может быть быстрее.

У меня также есть проблема, когда я пытаюсь выбрать все продукты по region_id (добавив что-то вроде «AND region_id = MYID»), это не работает, и мне интересно, возможно ли заставить его работать и как?

Спасибо за ваше время!

Решение

Вот мой последний запрос, может ли он кому-нибудь помочь:

SELECT p.*,
       s.name AS store_name,
       cs.name AS subcategory_name,
       cat.id AS category_id, cat.name AS category_name,
       c.id AS city_id, c.name AS city_name,
       r.id AS region_id, r.name AS region_name
  FROM products p
       JOIN stores s ON (s.id = p.store_id)
       JOIN categories_sub cs ON (cs.id = p.subcategory_id)
       JOIN categories cat ON (cat.id = cs.category_id)
       JOIN cities c ON (c.id = s.city_id)
       JOIN regions r ON (r.id = c.region_id)
  WHERE DATE(NOW()) BETWEEN p.date_start AND p.date_end

Спасибо!

Ответы [ 2 ]

6 голосов
/ 18 апреля 2009

Вам действительно нужно научиться использовать JOIN. Это фундаментальная операция для реляционных запросов, так же как цикл while() является базовой структурой управления в большинстве языков приложений.

Любая книга или учебник по SQL должны охватывать JOIN.

SELECT p.*, 
 s.name AS store_name, s.username AS store_username, 
 s.region_id, s.city_id,
 cs.name AS subcategory_name,
 c.name AS category_name
FROM products p
 JOIN stores s ON (s.id = p.store_id)
 JOIN categories c ON (c.id = p.category_id)
 JOIN categories_sub cs ON (cs.id = p.subcategory_id)
WHERE DATE(NOW()) BETWEEN p.date_start AND p.date_end

Теперь вы можете добавить больше условий к вашему предложению WHERE:

  AND s.region_id = ?;

Еще один комментарий ... Я пытался быть умным, используя предикат BETWEEN, но это может сбить с толку относительно простой оптимизатор MySQL. MySQL может быть проще оптимизировать исходный синтаксис:

WHERE p.date_start <= DATE(NOW()) AND p.date_end >= DATE(NOW())
1 голос
/ 18 апреля 2009
SELECT A.*, B.name AS store_name, B.username as store_username, B.region_id as region_id, B.city_id AS city_id, C.name AS subcategory_name, D.name AS category_name FROM products A, stores B, categories_sub C, categories D
WHERE B.id = A.store_id AND B.id = A.subcategory_id and C.id = A.category_id AND 
A.date_start <= DATE(NOW()) AND A.date_end >= DATE(NOW())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...