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
Форумы портала PHP.SU :: Версия для печати :: Не трудный вложенный запрос
Форумы портала PHP.SU » » Работа с СУБД » Не трудный вложенный запрос

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

1. Telnet - 29 Августа, 2013 - 18:46:47 - перейти к сообщению
Всем привет
Делаю так
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 таблиц
2. loktionov272 - 29 Августа, 2013 - 18:57:16 - перейти к сообщению
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 такое не может обработать...
3. Telnet - 29 Августа, 2013 - 19:10:31 - перейти к сообщению
так а разве
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 )
не тоже самое
4. loktionov272 - 29 Августа, 2013 - 19:12:49 - перейти к сообщению
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 ")
5. Telnet - 29 Августа, 2013 - 19:24:05 - перейти к сообщению
да я понял о чем Вы
а можно как то сделать что б искало?
Может как то нужно изменить тип данных этого столбца не var_char а какой то другой
6. EuGen - 29 Августа, 2013 - 19:51:08 - перейти к сообщению
loktionov272 пишет:
вернется строка "6893,6884,6883,... 6894,6892,8176", а IN такое не может обработать...

Неверно.
Telnet, наиболее вероятная причина - отсутствующие данные в таблице подзапроса.
7. loktionov272 - 29 Августа, 2013 - 19:53:34 - перейти к сообщению
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

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

то есть данные неверны на этапе формирования, не выборки.
9. LIME - 29 Августа, 2013 - 20:02:47 - перейти к сообщению
EuGen ах еслибы
он просто не знает о связи 1 к многим и хранит ее в поле через запятую
10. loktionov272 - 29 Августа, 2013 - 20:03:34 - перейти к сообщению
EuGen пишет:
Верный -
CODE (SQL):
скопировать код в буфер обмена
  1. (1, 6893, 3),
  2. (1, 6884, 3)
table_of_products пишет:

Duplicate entry '1' for key 'PRIMARY':
11. EuGen - 29 Августа, 2013 - 20:06:11 - перейти к сообщению
loktionov272
Несущественно. Смысл не меняется. Хотя Ctrl+Insert здесь да, не лучший выбор.
LIME
- по сути, это и означает неверное хранение, да. Для верной схемы каждое значение хранится отдельно.
12. loktionov272 - 29 Августа, 2013 - 20:09:54 - перейти к сообщению
вообщем-то выход может быть простым, если не нужны лишние телодвижения:
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);
13. Telnet - 29 Августа, 2013 - 20:10:31 - перейти к сообщению
т.е нужно передать это поле chgrid переделать на связь таблиц 1 ко многим
14. LIME - 29 Августа, 2013 - 20:21:27 - перейти к сообщению
loktionov272 этот «простой выход» упрощаея выборку усложняет все остальное
причем упрощает незначительно
а усложняет ой как сильно
надо таблицу связей делать
15. loktionov272 - 29 Августа, 2013 - 20:22:24 - перейти к сообщению
LIME пишет:
надо таблицу связей делать

Если есть возможность и желание, то это без сомнений лучший вариант.

 

Powered by ExBB FM 1.0 RC1