2009-11-06 1 views
2

У меня есть следующая структураОптимизировать Присоединяйтесь предложением с внешними ключами, и показать записи с нулями

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"; 

CREATE TABLE IF NOT EXISTS `sis_param_tax` (
    `id` int(5) NOT NULL auto_increment, 
    `description` varchar(50) NOT NULL, 
    `code` varchar(5) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=7; 

CREATE TABLE IF NOT EXISTS `sis_param_city` (
    `id` int(4) NOT NULL auto_increment, 
    `name` varchar(100) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ; 

CREATE TABLE IF NOT EXISTS `sis_supplier` (
    `id` int(15) NOT NULL auto_increment, 
    `name` varchar(200) NOT NULL, 
    `address` varchar(200) default NULL, 
    `phone` varchar(30) NOT NULL, 
    `fk_city` int(11) default NULL, 
    `fk_tax` int(11) default NULL, 
    PRIMARY KEY (`id`), 
    KEY `fk_city` (`fk_city`), 
    KEY `fk_tax` (`fk_tax`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ; 

ALTER TABLE `sis_supplier` 
    ADD CONSTRAINT `sis_supplier_ibfk_4` FOREIGN KEY (`fk_tax`) REFERENCES `sis_param_tax` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, 
    ADD CONSTRAINT `sis_supplier_ibfk_3` FOREIGN KEY (`fk_city`) REFERENCES `sis_param_city` (`id`) ON DELETE SET NULL ON UPDATE CASCADE; 

Мои вопросы

1. Эта структура позволяет мне иметь поставщик с городскими и налоговыми полями = нуль (в случае, если пользователь не установил эти значения). Правильно?

2. Если я удалю город «X», то fk_city поставщика с городом = «X» будет иметь значение null, то же самое с fk_tax. Правильно?

3. Я хочу, чтобы оптимизировать (ЕСЛИ МОЖНО) следующее предложение присоединиться, так что я могу показать поставщиков, которых имеют fk_city и/или fk_tax = NULL

SELECT DISTINCT 
    sis_supplier.id, 
    sis_supplier.name, 
    sis_supplier.telefono, 
    sis_supplier.address, 
    sis_supplier.phone, 
    sis_supplier.cuit, 
    sis_param_city.name AS city, 
    sis_param_tax.description AS tax, 
    sis_supplier.fk_city, 
    sis_supplier.fk_tax 
FROM 
    sis_supplier 
    LEFT OUTER JOIN sis_param_city 
    ON 
    sis_supplier.`fk_city` = sis_param_city.id 
    LEFT OUTER JOIN `sis_param_tax` 
    ON 
    sis_supplier.`fk_tax` = `sis_param_tax`.`id` 

спасибо много продвижение,

ответ

2
  1. Да.

  2. Да.

  3. Да, хорошо оптимизировать. Запрос, который вы показали, выглядит отлично. Как это не работает для вас?


Вы проанализировали запрос с EXPLAIN? Это может помочь вам определить, когда у вас есть запрос, который не использует индексы эффективно. Фактически, все Chapter 7 Optimization рекомендуется читать.

+0

Он работает нормально, я просто хотел узнать, оптимизирован ли запрос или если он может быть оптимизирован ... В случае, если он может быть оптимизирован, вы могли бы предложить лучший способ? Спасибо – Enrique

1

, если вы хотите, чтобы показать записи с нулями, чем использовать вправо или влево JOIN
зависит от ваших потребностей