|
|
|
| Интересует такой вопросик!
Есть табличка 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'
Короче если кто-то что-то понял то помогите)!?!)(*?%№(*: | |
|
|
|
|
|
|
|
для: sanchescom
(05.02.2010 в 12:13)
| | >Короче если кто-то что-то понял то помогите
А может не надо короче?
Может надо наоборот, длиннее?
Чтобы поняли?
>мне надо в случаи если найдутся совпадения во второй табличке вывести результат из первой!
Что за совпадения?
В каком виде результат? | |
|
|
|
|
|
|
|
для: Trianon
(05.02.2010 в 12:23)
| | Секунду сейчас распишу все подробно! | |
|
|
|
|
|
|
|
для: 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']."'"
|
И вот как же мне все это провернуть одним каким-то хитропопым запросом?! Вообще реально ли это сделать и что вы мне посоветует?!
Вроде расписал все, если что не поняли то спросите) | |
|
|
|
|
|
|
|
для: sanchescom
(05.02.2010 в 13:13)
| | Вы не привели дампов. Поэтому Ваши запросы не проверить, а задачу не промоделировать.
Строка Выражение OPTION_ID='1' && OPTION_ID='2' вызывает оторопь. равно 0 (false) всегда. | |
|
|
|
|
|
|
|
для: 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');
|
| |
|
|
|
|
|
|
|
для: 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 (условиям поискового запроса) нужно более детально определиться с возможностями поиска, которые Вы хотите реализовать. | |
|
|
|
|
|
|
|
для: Trianon
(06.02.2010 в 14:33)
| | Спасибо большое за помощь)! | |
|
|
|
|