Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Не трудный вложенный запрос

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (2): [1] 2 »   

> Без описания
Telnet
Отправлено: 29 Августа, 2013 - 18:46:47
Post Id


Частый гость


Покинул форум
Сообщений всего: 223
Дата рег-ции: Май 2011  


Помог: 1 раз(а)




Всем привет
Делаю так
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT  `value` ,  `sort`
  2. FROM  `chproduct`
  3. WHERE  `chgrid`
  4. IN ( 6893, 6884, 6883, 6920, 7353, 6889, 6881, 6921, 7476, 6890, 7474, 7478, 6887, 6919, 6918, 6936, 6885, 7477, 6888, 6926, 6933, 6901, 6894, 6892, 8176 )
  5. AND  `sort` >0
  6. ORDER BY sort
  7. LIMIT 0 , 30


Получаю все правильно
Датчик ориентации 1
Контрастность (типичная) 2
Но вместо этой длиной строки 6893, 6884, 6883, 6920, 7353, 6889, 6881, 6921, 7476, 6890, 7474, 7478, 6887, 6919, 6918, 6936, 6885, 7477, 6888, 6926, 6933, 6901, 6894, 6892, 8176 хотелось бы сразу сделать все в 1 запросе что не сначала получать ее в 1 потом вставлять в другой
Делаю так
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT  `value` ,  `sort`
  2. FROM  `chproduct`
  3. WHERE  `chgrid`
  4. IN (
  5. SELECT  `groups`
  6. FROM  `product`
  7. WHERE  `grcode` =3
  8. )
  9. AND
  10. `sort` > 0
  11. ORDER BY sort


Получаю
MySQL returned an empty result set (i.e. zero rows). (Query took 0.0012 sec)
почему так понять не могу, прошу Вашей помощи.
В аттаче sql для создания этих 2 таблиц
Скачать файл: catalog.sql
Скачан раз: 56
 
 Top
loktionov272
Отправлено: 29 Августа, 2013 - 18:57:16
Post Id


Гость


Покинул форум
Сообщений всего: 64
Дата рег-ции: Авг. 2013  


Помог: 2 раз(а)




Telnet пишет:
почему так понять не могу, прошу Вашей помощи.

Telnet пишет:
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT  `value` ,  `sort`
  2. FROM  `chproduct`
  3. WHERE  `chgrid`
  4. IN (
  5. SELECT  `groups`
  6. FROM  `product`
  7. WHERE  `grcode` =3
  8. )
  9. AND
  10. `sort` > 0
  11. ORDER BY sort

вернется строка "6893,6884,6883,... 6894,6892,8176", а IN такое не может обработать...

(Отредактировано автором: 29 Августа, 2013 - 18:58:12)

 
 Top
Telnet
Отправлено: 29 Августа, 2013 - 19:10:31
Post Id


Частый гость


Покинул форум
Сообщений всего: 223
Дата рег-ции: Май 2011  


Помог: 1 раз(а)




так а разве
IN ( 6893, 6884, 6883, 6920, 7353, 6889, 6881, 6921, 7476, 6890, 7474, 7478, 6887, 6919, 6918, 6936, 6885, 7477, 6888, 6926, 6933, 6901, 6894, 6892, 8176 )
не тоже самое
 
 Top
loktionov272
Отправлено: 29 Августа, 2013 - 19:12:49
Post Id


Гость


Покинул форум
Сообщений всего: 64
Дата рег-ции: Авг. 2013  


Помог: 2 раз(а)




Telnet пишет:
IN ( 6893, 6884, 6883, 6920, 7353, 6889, 6881, 6921, 7476, 6890, 7474, 7478, 6887, 6919, 6918, 6936, 6885, 7477, 6888, 6926, 6933, 6901, 6894, 6892, 8176 )

нет

IN (" 6893, 6884, 6883, 6920, 7353, 6889, 6881, 6921, 7476, 6890, 7474, 7478, 6887, 6919, 6918, 6936, 6885, 7477, 6888, 6926, 6933, 6901, 6894, 6892, 8176 ")
 
 Top
Telnet
Отправлено: 29 Августа, 2013 - 19:24:05
Post Id


Частый гость


Покинул форум
Сообщений всего: 223
Дата рег-ции: Май 2011  


Помог: 1 раз(а)




да я понял о чем Вы
а можно как то сделать что б искало?
Может как то нужно изменить тип данных этого столбца не var_char а какой то другой

(Отредактировано автором: 29 Августа, 2013 - 19:40:59)

 
 Top
EuGen Администратор
Отправлено: 29 Августа, 2013 - 19:51:08
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




loktionov272 пишет:
вернется строка "6893,6884,6883,... 6894,6892,8176", а IN такое не может обработать...

Неверно.
Telnet, наиболее вероятная причина - отсутствующие данные в таблице подзапроса.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
loktionov272
Отправлено: 29 Августа, 2013 - 19:53:34
Post Id


Гость


Покинул форум
Сообщений всего: 64
Дата рег-ции: Авг. 2013  


Помог: 2 раз(а)




EuGen пишет:
loktionov272 пишет:
вернется строка "6893,6884,6883,... 6894,6892,8176", а IN такое не может обработать...

Неверно.

хм, а что же тогда?
CODE (SQL):
скопировать код в буфер обмена
  1. CREATE TABLE IF NOT EXISTS `product` (
  2.   `id` int(11) NOT NULL AUTO_INCREMENT,
  3.   `groups` varchar(1024) NOT NULL,
  4.   `grcode` int(11) NOT NULL DEFAULT '-1',
  5.   PRIMARY KEY (`id`)
  6. ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=11698 ;
  7.  
  8. INSERT INTO `product` (`id`, `groups`, `grcode`) VALUES
  9. (1, '6893,6884,6883,6920,7353,6889,6881,6921,7476,6890,7474,7478,6887,6919,6918,6936,6885,7477,6888,6926,6933,6901,6894,6892,8176', 3);

(Добавление)
EuGen пишет:
отсутствующие данные в таблице подзапроса.

они есть, подзапрос
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT  `groups`
  2. FROM  `product`
  3. WHERE  `grcode` =3

как раз и вернет ту строку

(Отредактировано автором: 29 Августа, 2013 - 19:56:16)

 
 Top
EuGen Администратор
Отправлено: 29 Августа, 2013 - 19:58:17
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Подзапрос вернёт множество значений, а не строку из этих значений. Хотя нет, кажется, понял, о чём речь - автор темы имеет некорректный INSERT.
Верный - такой:
CODE (SQL):
скопировать код в буфер обмена
  1. INSERT INTO `product` (`id`, `groups`, `grcode`) VALUES
  2. (1, 6893, 3),
  3. (2, 6884, 3),
  4. ...

то есть данные неверны на этапе формирования, не выборки.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
LIME
Отправлено: 29 Августа, 2013 - 20:02:47
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




EuGen ах еслибы
он просто не знает о связи 1 к многим и хранит ее в поле через запятую
 
 Top
loktionov272
Отправлено: 29 Августа, 2013 - 20:03:34
Post Id


Гость


Покинул форум
Сообщений всего: 64
Дата рег-ции: Авг. 2013  


Помог: 2 раз(а)




EuGen пишет:
Верный -
CODE (SQL):
скопировать код в буфер обмена
  1. (1, 6893, 3),
  2. (1, 6884, 3)
table_of_products пишет:

Duplicate entry '1' for key 'PRIMARY':
 
 Top
EuGen Администратор
Отправлено: 29 Августа, 2013 - 20:06:11
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




loktionov272
Несущественно. Смысл не меняется. Хотя Ctrl+Insert здесь да, не лучший выбор.
LIME
- по сути, это и означает неверное хранение, да. Для верной схемы каждое значение хранится отдельно.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
loktionov272
Отправлено: 29 Августа, 2013 - 20:09:54
Post Id


Гость


Покинул форум
Сообщений всего: 64
Дата рег-ции: Авг. 2013  


Помог: 2 раз(а)




вообщем-то выход может быть простым, если не нужны лишние телодвижения:
PHP:
скопировать код в буфер обмена
  1. //получение данных и запись их в $groups из БД
  2. $groups = '6893, 6884, 6883, 6920, 7353, 6889, 6881, 6921, 7476, 6890, 7474, 7478, 6887, 6919, 6918, 6936, 6885, 7477, 6888, 6926, 6933, 6901, 6894, 6892, 8176';
  3.  

затем
PHP:
скопировать код в буфер обмена
  1. $sql =  "SELECT  `value` ,  `sort`
  2.    FROM  `chproduct`
  3.    WHERE  `chgrid`
  4.    IN ($groups)
  5.    AND  `sort` >0
  6.    ORDER BY sort
  7.    LIMIT 0 , 30";
  8. $result = *_query($sql);

(Отредактировано автором: 29 Августа, 2013 - 20:13:25)

 
 Top
Telnet
Отправлено: 29 Августа, 2013 - 20:10:31
Post Id


Частый гость


Покинул форум
Сообщений всего: 223
Дата рег-ции: Май 2011  


Помог: 1 раз(а)




т.е нужно передать это поле chgrid переделать на связь таблиц 1 ко многим
 
 Top
LIME
Отправлено: 29 Августа, 2013 - 20:21:27
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




loktionov272 этот «простой выход» упрощаея выборку усложняет все остальное
причем упрощает незначительно
а усложняет ой как сильно
надо таблицу связей делать
 
 Top
loktionov272
Отправлено: 29 Августа, 2013 - 20:22:24
Post Id


Гость


Покинул форум
Сообщений всего: 64
Дата рег-ции: Авг. 2013  


Помог: 2 раз(а)




LIME пишет:
надо таблицу связей делать

Если есть возможность и желание, то это без сомнений лучший вариант.
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Работа с СУБД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB