Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Выборка данных из одной таблицы по совпадениям из другой)
 
 автор: sanchescom   (05.02.2010 в 12:13)   письмо автору
 
 

Интересует такой вопросик!

Есть табличка b_auto_result

ID | USER_ID | MODEL_ID
1 1 23

Еще есть табличка b_auto_result_option

ID | RESULT_ID | OPTION_ID
1 1 1
2 1 2
3 2 1

Вопрос! Как мне одним запросом цепануть данные? То есть мне надо в случаи если найдутся совпадения во второй табличке вывести результат из первой!

Пробовал сначала так:

SELECT R.MODEL_ID FROM b_auto_result R LEFT JOIN b_auto_result_option ON (R.ID=RO.RESULT_ID) WHERE RO.OPTION_ID='1'

Но в этом случаи он возвращает мне 2 результата. Ну это более или менее понятно.

Еще вариант такой:

SELECT MODEL_ID FROM b_auto_result WHERE ID = IN (SELECT RESULT_ID  FROM b_auto_result_option WHERE OPTION_ID='1') 
- этот вариант возвращает нужный результат но если мне надо поискать по нескольким OPTION_ID то болт. Делаю так OPTION_ID='1' && OPTION_ID='2'

Короче если кто-то что-то понял то помогите)!?!)(*?%№(*:

  Ответить  
 
 автор: Trianon   (05.02.2010 в 12:23)   письмо автору
 
   для: sanchescom   (05.02.2010 в 12:13)
 

>Короче если кто-то что-то понял то помогите

А может не надо короче?
Может надо наоборот, длиннее?
Чтобы поняли?

>мне надо в случаи если найдутся совпадения во второй табличке вывести результат из первой!

Что за совпадения?
В каком виде результат?

  Ответить  
 
 автор: sanchescom   (05.02.2010 в 12:28)   письмо автору
 
   для: Trianon   (05.02.2010 в 12:23)
 

Секунду сейчас распишу все подробно!

  Ответить  
 
 автор: sanchescom   (05.02.2010 в 13:13)   письмо автору
 
   для: Trianon   (05.02.2010 в 12:23)
 

Еще раз приведу пример табличкек: b_auto_result, b_auto_result_option
b_auto_result
ID|USER_I|CATEGORY_ID|YEAR_ID|CUSTOMS|ENG_VOLUM | CITY_ID | MARK_ID |MODEL_ID
__1____1______1_________1_______TEXT______TEXT_______2________2______23_____
__2____2______1_________1_______TEXT______TEXT_______1________1______11_____
b_auto_result_option
ID | RESULT_ID | OPTION_ID
__1_____1_________3_______
__2_____1_________1_______
__3_____2_________3_______
ну еще есть ряд дополнительных табличек это понятно.

В обще полный запрос такой:

$query ="SELECT
                R.*,
                C.CATEGORY,
                CY.CITY,
                MR.MARK,
                MO.MODEL,
                Y.YEAR
            FROM
                b_auto_result R
            LEFT JOIN b_auto_cat C ON (C.ID = R.CATEGORY_ID)
            LEFT JOIN b_auto_city CY ON (CY.ID = R.CITY_ID)
            LEFT JOIN b_auto_mark MR ON (MR.ID = R.MARK_ID)
            LEFT JOIN b_auto_model MO ON (MO.ID = R.MODEL_ID)
            LEFT JOIN b_auto_year Y ON (Y.ID = R.YEAR_ID)";


Далее получаем доп.опции...

$q = mysql_query($query);
$f = mysql_fetch_array($q);


$query = "SELECT 
                                    O.OPTION 
                  FROM 
                                    b_auto_result_option RO 
                 LEFT JOIN b_auto_options O ON (O.ID = RO.OPTION_ID) 
                 WHERE RO.RESULT_ID='".$f['ID']."'"


Сразу зреет вопросик, могу ли решить эту задачу одним запросом?

Далее...

Мне требуется организовать поиск! И вот тут возникает как минимум 2 вопроса над которыми бьюсь не один день.
1. Если я ищу только по тем полям которые есть в b_auto_result все отлично, результат есть но мне приходится тащить за сбой еще и выборку из b_auto_result_option.
2. Если мне надо искать и по первой таблице и по второй то тут уже проблема!

С начало я подумал, а не объединить ли мне эти 2 таблички... Сделал... В результате получил две строки с OPTION_ID='3' и OPTION_ID='1'.

Начал думать может как-то можно вложенным запросом.
В результате получил такое запрос:

$query ="SELECT
                R.*,
                C.CATEGORY,
                CY.CITY,
                MR.MARK,
                MO.MODEL,
                Y.YEAR
            FROM
                b_auto_result R
            LEFT JOIN b_auto_cat C ON (C.ID = R.CATEGORY_ID)
            LEFT JOIN b_auto_city CY ON (CY.ID = R.CITY_ID)
            LEFT JOIN b_auto_mark MR ON (MR.ID = R.MARK_ID)
            LEFT JOIN b_auto_model MO ON (MO.ID = R.MODEL_ID)
            LEFT JOIN b_auto_year Y ON (Y.ID = R.YEAR_ID)";
                       WHERE
                                       R.CATEGORY_ID='1'
                        AND       R.ID IN (SELECT 
                                    RESULT_ID 
                             FROM
                                    b_auto_result_opt
                             WHERE
                                    OPTION_ID='1')

Он выдает нужный результат, но стоит мне поискать еще по одному OPTION_ID то все делаю так
OPTION_ID='1' && OPTION_ID='2'

И даже такой вложенный запрос не вернет мне поле OPTION из таблички b_auto_options. Тоесть в любой случаи надо делать

$query = "SELECT 
                                    O.OPTION 
                  FROM 
                                    b_auto_result_option RO 
                 LEFT JOIN b_auto_options O ON (O.ID = RO.OPTION_ID) 
                 WHERE RO.RESULT_ID='".$f['ID']."'"


И вот как же мне все это провернуть одним каким-то хитропопым запросом?! Вообще реально ли это сделать и что вы мне посоветует?!

Вроде расписал все, если что не поняли то спросите)

  Ответить  
 
 автор: Trianon   (05.02.2010 в 15:40)   письмо автору
 
   для: sanchescom   (05.02.2010 в 13:13)
 

Вы не привели дампов. Поэтому Ваши запросы не проверить, а задачу не промоделировать.
Строка Выражение OPTION_ID='1' && OPTION_ID='2' вызывает оторопь. равно 0 (false) всегда.

  Ответить  
 
 автор: sanchescom   (05.02.2010 в 15:53)   письмо автору
 
   для: Trianon   (05.02.2010 в 15:40)
 

Вот дампы таблиц ->>>
--
-- Структура таблицы `b_auto_cat`
--

CREATE TABLE IF NOT EXISTS `b_auto_cat` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `CATEGORY` varchar(255) NOT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=MyISAM  DEFAULT CHARSET=cp1251 AUTO_INCREMENT=26 ;

--
-- Дамп данных таблицы `b_auto_cat`
--

INSERT INTO `b_auto_cat` (`ID`, `CATEGORY`) VALUES
(1, 'Легковые автомобили'),
(2, 'Легкие коммерческие');

-- --------------------------------------------------------

--
-- Структура таблицы `b_auto_city`
--

CREATE TABLE IF NOT EXISTS `b_auto_city` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `CITY` varchar(255) NOT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=MyISAM  DEFAULT CHARSET=cp1251 AUTO_INCREMENT=26 ;

--
-- Дамп данных таблицы `b_auto_city`
--

INSERT INTO `b_auto_city` (`ID`, `CITY`) VALUES
(1, 'Иваново'),
(2, 'Москва'),
(3, 'Ярославль'),
(4, 'Владимир');

-- --------------------------------------------------------

--
-- Структура таблицы `b_auto_mark`
--

CREATE TABLE IF NOT EXISTS `b_auto_mark` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `MARK` varchar(255) NOT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=MyISAM  DEFAULT CHARSET=cp1251 AUTO_INCREMENT=3 ;

--
-- Дамп данных таблицы `b_auto_mark`
--

INSERT INTO `b_auto_mark` (`ID`, `MARK`) VALUES
(1, 'ВАЗ'),
(2, 'УАЗ');

-- --------------------------------------------------------

--
-- Структура таблицы `b_auto_model`
--

CREATE TABLE IF NOT EXISTS `b_auto_model` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `MARK_ID` int(11) NOT NULL,
  `MODEL` varchar(255) NOT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=MyISAM  DEFAULT CHARSET=cp1251 AUTO_INCREMENT=3 ;

--
-- Дамп данных таблицы `b_auto_model`
--

INSERT INTO `b_auto_model` (`ID`, `MARK_ID`, `MODEL`) VALUES
(1, 1, 'Калина'),
(2, 2, 'Патриот');

-- --------------------------------------------------------

--
-- Структура таблицы `b_auto_options`
--

CREATE TABLE IF NOT EXISTS `b_auto_options` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `OPTION` varchar(255) NOT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=MyISAM  DEFAULT CHARSET=cp1251 AUTO_INCREMENT=35 ;

--
-- Дамп данных таблицы `b_auto_options`
--

INSERT INTO `b_auto_options` (`ID`, `OPTION`) VALUES
(1, 'аудиосистема'),
(2, 'аудиоподготовка'),
(3, 'радио'),
(4, 'магнитола'),
(5, 'CD'),
(6, 'CD - чейнджер'),
(7, 'MP3'),
(8, 'Кондиционер'),
(9, 'Кондиционер'),
(10, 'ABS'),
(11, 'Антипробуксовочная система'),
(12, 'ESP'),
(13, 'EBD'),
(14, 'Центральный замок'),
(15, 'Сигнализция'),
(16, 'Иммобилайзер'),
(17, 'Паркотроник'),
(18, 'Механическая защита'),
(19, 'Спутниковая система'),
(20, 'Навигация'),
(21, 'Ксеноновые фары'),
(22, 'Противотуманные фары'),
(23, 'Омыватель фар'),
(24, 'Подушка безопасности водителя'),
(25, 'Подушка безопасности пассажира'),
(26, 'Подушки безопасности боковые'),
(27, 'Регулируемое водительское сиденье по высоте'),
(28, 'Регулируемое пассажирское сиденье по высоте'),
(29, 'Электрические стеклоподъемники'),
(30, 'Эл. привод водит. сиденья'),
(31, 'Эл. привод пассажир. сиденья'),
(32, 'Эл. привод зеркал'),
(33, 'Тонированные стекла'),
(34, 'Люк');

-- --------------------------------------------------------

--
-- Структура таблицы `b_auto_result`
--

CREATE TABLE IF NOT EXISTS `b_auto_result` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `USER_ID` int(11) NOT NULL,
  `CATEGORY_ID` int(11) NOT NULL,
  `YEAR_ID` int(11) NOT NULL,
  `CUSTOMS` text,
  `ENG_VOLUM` text,
  `CITY_ID` int(11) NOT NULL,
  `MARK_ID` int(11) NOT NULL,
  `MODEL_ID` int(11) NOT NULL,
  `COLOR_CODE` varchar(255) DEFAULT NULL,
  `INTERIOR` text,
  `GB_TYPE_ID` int(11) NOT NULL,
  `WHEEL_TYPE_ID` int(11) NOT NULL,
  `RUN` varchar(255) DEFAULT NULL,
  `DG_TYPE_ID` int(11) NOT NULL,
  `BODY_TYPE_ID` int(11) NOT NULL,
  `ENGINE_POWER` text NOT NULL,
  `MONEY` text NOT NULL,
  `INFORMATION` mediumtext,
  `TIMESTAMP` datetime DEFAULT NULL,
  `ACTION` enum('Y','N') NOT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=MyISAM  DEFAULT CHARSET=cp1251 AUTO_INCREMENT=29 ;

--
-- Дамп данных таблицы `b_auto_result`
--

INSERT INTO `b_auto_result` (`ID`, `USER_ID`, `CATEGORY_ID`, `YEAR_ID`, `CUSTOMS`, `ENG_VOLUM`, `CITY_ID`, `MARK_ID`, `MODEL_ID`, `COLOR_CODE`, `INTERIOR`, `GB_TYPE_ID`, `WHEEL_TYPE_ID`, `RUN`, `DG_TYPE_ID`, `BODY_TYPE_ID`, `ENGINE_POWER`, `MONEY`, `INFORMATION`, `TIMESTAMP`, `ACTION`) VALUES
(26, 1, 22, 1, '12312', '123123', 22, 1, 1, '12312312', '3123', 1, 1, '12312123', 1, 1, '123123', '123', '', '2010-01-20 13:28:11', 'Y'),
(28, 1, 1, 1, '', '', 1, 1, 1, '', '', 1, 1, '', 1, 1, '', '', '', '2010-01-20 16:50:39', 'Y'),
(25, 1, 22, 1, '12312', '123123', 22, 1, 1, '12312312', '3123', 1, 1, '12312123', 1, 1, '123123', '123', '', '2010-01-20 13:20:58', 'Y'),
(24, 1, 22, 1, '12312', '123123', 22, 1, 1, '12312312', '3123', 1, 1, '12312123', 1, 1, '123123', '123', '', '2010-01-20 13:19:12', 'Y'),
(27, 1, 1, 1, '', '', 1, 1, 1, '', '', 1, 1, '', 1, 1, '', '', '', '2010-01-20 16:37:36', 'Y'),
(23, 1, 22, 1, '12312', '123123', 22, 1, 1, '12312312', '3123', 1, 1, '12312123', 1, 1, '123123', '123', '', '2010-01-20 13:14:55', 'Y'),
(22, 1, 2, 2, 'Дает добро', '2.5', 24, 2, 2, 'Красненький', 'Мех', 1, 2, '150', 3, 2, '10000', '5000000', '', '2010-01-25 13:02:36', 'Y');

-- --------------------------------------------------------

--
-- Структура таблицы `b_auto_result_opt`
--

CREATE TABLE IF NOT EXISTS `b_auto_result_opt` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `RESULT_ID` int(11) NOT NULL,
  `OPTION_ID` int(11) NOT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=MyISAM  DEFAULT CHARSET=cp1251 AUTO_INCREMENT=99 ;

--
-- Дамп данных таблицы `b_auto_result_opt`
--

INSERT INTO `b_auto_result_opt` (`ID`, `RESULT_ID`, `OPTION_ID`) VALUES
(54, 28, 4),
(53, 28, 2),
(52, 28, 1),
(51, 27, 4),
(50, 27, 1),
(28, 26, 22),
(27, 25, 22),
(26, 24, 22),
(25, 23, 22),
(98, 22, 1);

-- --------------------------------------------------------

--
-- Структура таблицы `b_auto_year`
--

CREATE TABLE IF NOT EXISTS `b_auto_year` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `YEAR` varchar(255) NOT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=MyISAM  DEFAULT CHARSET=cp1251 AUTO_INCREMENT=3 ;

--
-- Дамп данных таблицы `b_auto_year`
--

INSERT INTO `b_auto_year` (`ID`, `YEAR`) VALUES
(1, '1900'),
(2, '1901');

  Ответить  
 
 автор: Trianon   (06.02.2010 в 14:33)   письмо автору
 
   для: sanchescom   (05.02.2010 в 15:53)
 

Выдать результат со всеми опциями можно с помощью группирующего запроса и агрегатной функции GROUP_CONCAT :

SELECT r.ID, GROUP_CONCAT(o.OPTION   ORDER BY ro.OPTION_ID SEPARATOR '; ') AS OPTS
  FROM b_auto_result r
    LEFT JOIN b_auto_result_opt ro ON ro.RESULT_ID = r.ID
    LEFT JOIN b_auto_options o ON o.ID = ro.OPTION_ID
  GROUP BY r.ID


Или без группировки - в столбик (c накоплением в цикле приложения - при разборе результата):
SELECT r.ID, o.OPTION 
  FROM b_auto_result r
    LEFT JOIN b_auto_result_opt ro ON ro.RESULT_ID = r.ID
    LEFT JOIN b_auto_options o ON o.ID = ro.OPTION_ID
  GROUP BY r.ID
  ORDER BY r.ID


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

  Ответить  
 
 автор: sanchescom   (09.02.2010 в 19:03)   письмо автору
 
   для: Trianon   (06.02.2010 в 14:33)
 

Спасибо большое за помощь)!

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования