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

Форум MySQL

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

 

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

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

тема: Запрос SELECT ...WHERE IN(SELECT...)
 
 автор: deniel   (06.01.2010 в 00:48)   письмо автору
 
 

Здравствуйте!
У меня появилась проблема с реализацией запроса с применением получения поля с множеством (1,2,3,4) и задача его как аргумента в IN(). Проблема заключается в том, что из этой строки "1,2,3,4" срабатывает лишь первое значение, как это можно альтернативно реализовать или дело в параметрах настройки MySQL? Спасибо.

SELECT `name`, `id` FROM `table` WHERE `id` IN (SELECT `values` FROM `tableTwo` WHERE `uri` = `string`)

В результате получается лишь одна строка, хотя должно быть больше.

  Ответить  
 
 автор: Вурдалак   (06.01.2010 в 02:15)   письмо автору
 
   для: deniel   (06.01.2010 в 00:48)
 

Почитай в мануале что есть IN (SELECT ...). Это не функция.

  Ответить  
 
 автор: cheops   (06.01.2010 в 14:56)   письмо автору
 
   для: deniel   (06.01.2010 в 00:48)
 

Можете прикрепить к сообщению дампы таблиц table и tableTwo чтобы можно было воспроизвести ситуацию?

  Ответить  
 
 автор: deniel   (06.01.2010 в 20:29)   письмо автору
 
   для: cheops   (06.01.2010 в 14:56)
 

Нашел решение данной проблемы в рецептах Энтони Молинаро.
SELECT `nbr` FROM `Table1` 
       WHERE `nbr` IN ((SELECT SUBSTRING_INDEX(    SUBSTRING_INDEX(list.vals,',',iter.pos),',', -1) `nbr`
                FROM (SELECT `nbr` pos FROM `Table1`) as iter,         
                         (SELECT `nbrs` as vals FROM `Table2`) list             
                                  WHERE iter.pos <= (length(list.vals) - LENGTH(REPLACE(list.vals,',','')))+1))


-- Table1 Table
CREATE TABLE IF NOT EXISTS `Table1` (
  `nbr` int(10) unsigned NOT NULL default 0,
  `name` varchar(255) NOT NULL default '',
  PRIMARY KEY (`nbr`)
) ENGINE=MyISAM;

-- Table2 Table
CREATE TABLE IF NOT EXISTS `Table2` (
  `this_nbr` int(10) unsigned NOT NULL default 0,
  `nbrs` varchar(255) NOT NULL default '',
  PRIMARY KEY (`this_nbr`)
) ENGINE=MyISAM;

INSERT INTO `Table1` VALUES  (1,'string')
INSERT INTO `Table2` VALUES  (1,'1,2,3,4,5')

  Ответить  
 
 автор: Fractured#   (06.01.2010 в 21:01)   письмо автору
 
   для: deniel   (06.01.2010 в 20:29)
 

Мне интересно с какой целью необходимо всё пихнуть в 1 (один) запрос. Неужели это читабельнее, чем 2 запроса, но более простых? Или ты уверен, что 1 (один) запрос будет быстрее?

  Ответить  
 
 автор: deniel   (13.01.2010 в 18:33)   письмо автору
 
   для: Fractured#   (06.01.2010 в 21:01)
 

Проверил, один запрос выполняется такого вида в 3.2 раза дольше, чем разделенный на два отдельных запроса; дело в цикличности конструкции WHERE.

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

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