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 :: Версия для печати :: Ошибка #1242 - Subquery returns more than 1 row
Форумы портала PHP.SU » PHP » SQL и Архитектура БД » Ошибка #1242 - Subquery returns more than 1 row

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

1. Alexander Goryachij - 07 Февраля, 2013 - 08:20:43 - перейти к сообщению
результат запроса - #1242 - Subquery returns more than 1 row
а мне от него как раз и нужно чтоб он выдавал "more tnan 1 row", помогите начинающему программисту Радость

CODE (SQL):
скопировать код в буфер обмена
  1. SELECT c.department, b.aux_build, b.tnum, d.surname, d.name, d.secondname, d.birthday, d.sex, b.tld_1, b.tld_2, b.priznak, sum( a.hp10_gamma + a.hp10_n ) AS dose_summa
  2. FROM dose_rados a, tld_num b, perehod c, pers_idk d WHERE b.tnum = ( SELECT DISTINCT tnum FROM tld_num WHERE tnum<>'0' ) AND c.tnum = d.tnum AND b.tnum = d.tnum
  3. AND b.priznak NOT LIKE 'фон' AND ( a.dosim_num = b.tld_1 OR a.dosim_num = b.tld_2 )
  4. AND a.date_change >= '$year' AND a.date_change <= '$end_date' HAVING dose_summa >=10
2. Stierus - 07 Февраля, 2013 - 08:30:56 - перейти к сообщению

замени на
CODE (SQL):
скопировать код в буфер обмена
  1. WHERE b.tnum IN ( SELECT
3. Alexander Goryachij - 07 Февраля, 2013 - 08:51:55 - перейти к сообщению
Stierus пишет:
замени на
CODE (SQL):
скопировать код в буфер обмена
  1. WHERE b.tnum IN ( SELECT


я так пробовал уже, запрос вернул 1 строку со случайным name surname...и т.д. и просуммировал все значения dose_summa .... я в тупике)))
4. Stierus - 07 Февраля, 2013 - 09:17:55 - перейти к сообщению
ты написал ошибку - я написал как от нее избавиться, какие проблемы с логикой запроса - другой вопрос, на него я смогу отвечать только когда узнаю, что ты от запоса хочешь
5. Alexander Goryachij - 07 Февраля, 2013 - 09:30:43 - перейти к сообщению
Stierus пишет:
ты написал ошибку - я написал как от нее избавиться, какие проблемы с логикой запроса - другой вопрос, на него я смогу отвечать только когда узнаю, что ты от запоса хочешь


От этого запроса требуется чтоб он выдал каждого чела, у которого dose_summa >=10 за заданный период времени..
6. imya - 07 Февраля, 2013 - 09:36:38 - перейти к сообщению
Alexander Goryachij пишет:
От этого запроса требуется чтоб он выдал каждого чела, у которого dose_summa >=10 за заданный период времени..


Так ведь можно это одним запросом сделать, без подзапроса
7. Alexander Goryachij - 07 Февраля, 2013 - 09:45:38 - перейти к сообщению
imya пишет:
Alexander Goryachij пишет:
От этого запроса требуется чтоб он выдал каждого чела, у которого dose_summa >=10 за заданный период времени..


Так ведь можно это одним запросом сделать, без подзапроса


Я с вами согласен - можно вот даже пример такого запроса
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT perehod.department, perehod.aux_build, doz_tld.tnum,
  2.    pers_idk.surname, pers_idk.name, pers_idk.secondname,
  3.    pers_idk.sex, pers_idk.birthday, SUM( doz_tld.dose ) AS dose_summa  
  4.    FROM doz_tld, pers_idk, perehod WHERE doz_tld.date >= '$year' AND doz_tld.date <= '$end_date'
  5.    AND perehod.department NOT LIKE 'КОМАНД' AND ( doz_tld.date <= perehod.date_out OR perehod.date_out IS NULL )
  6.    AND doz_tld.tnum = pers_idk.tnum AND pers_idk.tnum = perehod.tnum GROUP BY tnum HAVING dose_summa >=10
8. Stierus - 07 Февраля, 2013 - 10:45:30 - перейти к сообщению
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT
  2.         c.department,
  3.         b.aux_build,
  4.         b.tnum,
  5.         d.surname,
  6.         d.name,
  7.         d.secondname,
  8.         d.birthday,
  9.         d.sex,
  10.         b.tld_1,
  11.         b.tld_2,
  12.         b.priznak,
  13.         sum( a.hp10_gamma + a.hp10_n ) AS dose_summa
  14. FROM tld_num b
  15. INNER JOIN pers_idk d  ON d.tnum = b.tnum
  16. INNER JOIN perehod c ON c.tnum = d.tnum
  17. INNER JOIN dose_rados a ON a.dosim_num = b.tld_1 OR a.dosim_num = b.tld_2
  18.  
  19. WHERE b.tnum <>'0'
  20. AND b.priznak NOT LIKE 'фон'
  21. AND a.date_change BETWEEN '$year' AND '$end_date'
  22. AND sum( a.hp10_gamma + a.hp10_n ) >=10


Твой запрос, нормально оформленный, без структуры таблиц, не могу протестить
9. Alexander Goryachij - 08 Февраля, 2013 - 08:24:03 - перейти к сообщению
спасибо! я решил вопрос - добавил в таблицу dose_rados поле tnum
и выполнив запрос
CODE (SQL):
скопировать код в буфер обмена
  1. UPDATE dose_rados, tld_num SET dose_rados.tnum=tld_num.tnum
  2.  WHERE dose_rados.dosim_num=tld_num.tld_1 OR dose_rados.dosim_num=tld_num.tld_2


возможно есть еще способы..)

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

== Table structure for table dose_rados

|------
|Field|Type|Null|Default
|------
|tnum|int(11)|Yes|NULL
|dosim_num|bigint(6)|Yes|NULL
|date_change|date|Yes|NULL
|burning|int(3)|Yes|NULL
|hp10_gamma|float(8,4)|Yes|NULL
|hp_surface|float(8,4)|Yes|NULL
|hp007|float(8,4)|Yes|NULL
|hp10_n|float(8,4)|Yes|NULL
|date|date|Yes|NULL
|time|time|Yes|NULL
|reader|text|Yes|NULL
|operator|text|Yes|NULL
== Table structure for table dose_rados

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

== Table structure for table perehod

|------
|Field|Type|Null|Default
|------
|tnum|int(11)|Yes|NULL
|enterprise|text|No|
|department|text|Yes|NULL
|aux_build|int(11)|No|
|trip|tinyint(1)|No|
|category|text|No|
|critical_group|tinyint(1)|No|
|cassette|int(11)|Yes|NULL
|shop|text|Yes|NULL
|post|text|Yes|NULL
|date_in|date|Yes|NULL
|date_out|date|Yes|NULL
|conditions|text|Yes|NULL
|date_op|date|Yes|NULL
|time_op|time|Yes|NULL
|operator|text|No|
== Table structure for table perehod

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

== Table structure for table pers_idk

|------
|Field|Type|Null|Default
|------
|inn|int(10)|Yes|NULL
|tnum|int(11)|Yes|NULL
|surname|text|Yes|NULL
|name|text|Yes|NULL
|secondname|text|Yes|NULL
|sex|tinytext|Yes|NULL
|birthday|date|Yes|NULL
|bodycounter|tinyint(1)|Yes|NULL
|medical|tinyint(1)|No|
|medical_date|date|No|
|examination|tinyint(1)|No|
|exam_date|date|No|
|pregnancy|tinyint(1)|Yes|NULL
|dose_before_npp|float|Yes|NULL
|dose_before_where|text|Yes|NULL
|passport|text|Yes|NULL
|photo|blob|Yes|NULL
|date_op|date|Yes|NULL
|time_op|time|Yes|NULL
|operator|text|No|
== Table structure for table pers_idk
-------------------------------- -------------------------------- -------------------------------- ----------

== Table structure for table tld_num

|------
|Field|Type|Null|Default
|------
|tnum|int(11)|No|
|tld_1|int(7)|No|
|tld_2|int(7)|No|
|priznak|text|No|
|cass_tl|int(7)|No|
|aux_build|tinyint(2)|No|
== Table structure for table tld_num
10. flash_br - 29 Ноября, 2014 - 17:32:51 - перейти к сообщению
Всем привет!
Дабы не плодить темы - напишу тут .. тем более, что по тематике как раз подходит ...

Дело вот в чём .. очень нужно сделать запрос типа (LIKE IN)

вот есть рабличка
---------------------------
| id | marka | tsk |
---------------------------
| 1 | опель | GM |
| 2 | шевроле| GM |
---------------------------
(сорри за корявую псевдографику)

я делаю запрос в другой таблице с обращением сюда

CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. SELECT `marka_am`, `tsk`  FROM `import_sales_2014-11-28` WHERE `tsk` = 'GM' AND `marka_am` LIKE  (SELECT `marka` FROM `marki_tsk_sales` WHERE `tsk` = 'GM')
  3.  


и логично, что он мне отвечает

CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. Subquery returns more than 1 row
  3.  


а мне так и надо т.к. в поле `marka_am` содержатся строки типа "Опель Астра, Опель Корса, Шевроле Кобальт, Шевроле нива" и т.д. и выбрать надо только то, что совпадпет с МАРКОЙ содержащейся в первой табличке ... тут скорее всего как-то регуляркой .... но я не знаю как .. интернеты копал целый день ... прошу помощи )))
11. Viper - 29 Ноября, 2014 - 17:40:30 - перейти к сообщению
flash_br пишет:
очень нужно сделать запрос типа (LIKE IN)
в чем смысл делать LIKE если у вас марки авто не в тексте, а "как есть"?
12. Мелкий - 29 Ноября, 2014 - 17:43:39 - перейти к сообщению
Вы пытаетесь странным образом сделать join?

И всё-таки у нас не принято поднимать старые темы, открыть новую предпочтительнее. Об этом даже должно было быть написано рядом с полем комментария.
13. flash_br - 29 Ноября, 2014 - 17:50:17 - перейти к сообщению
Viper пишет:
в чем смысл делать LIKE если у вас марки авто не в тексте, а "как есть"?


мне по факту нужен LIKE '%%' что бы из списка машин выбрать те, которые соответствуюс списку перечисленных марок, а их может быть мноооого .. перечислять все - не удобно
(Добавление)
Мелкий пишет:
И всё-таки у нас не принято поднимать старые темы, открыть новую предпочтительнее. Об этом даже должно было быть написано рядом с полем комментария.


Возможно и JOIN )))) но не понимаю как)))

А про оживление темы - пардоньте ))) наверное просто не заметил, где это написано .. (((
14. Viper - 29 Ноября, 2014 - 17:54:27 - перейти к сообщению
flash_br приведите вид обеих табличек с парой строк данных для вида и напишите что хотите получить на выходе после выполнения запроса. Так будет проще и нам и вам.
15. flash_br - 29 Ноября, 2014 - 22:19:44 - перейти к сообщению
первая имеет такой вид
CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. marka   tsk    
  3. Опель   ТСК GM
  4. Шевроле ТСК GM
  5.  


вторая такой
CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. marka_am        tsk    
  3.        
  4. Шевроле Нива    ТСК GM
  5. Шевроле Лач     ТСК GM
  6. Опель Корса     ТСК GM
  7. Шевроле Нива    ТСК GM
  8. Шевроле         ТСК GM
  9. Опель Астра     ТСК GM
  10. Шевроле Коб     ТСК GM
  11. Хендай Солярис  ТСК GM
  12. Ниссан Жук      ТСК GM
  13.  


1. на выходе мне нужно посчиать количество машин из второй таблицы, марки которых есть в первой таблице (ну тут в принципе проблем нет)
2. И потом посчитать все остальные, марок которых нет в первой таблице (вот и из-за этого я и заморочился вопросом про нечто вроде LIKE IN ... т.к. сначала можно было бы сделать LIKE IN ****, а потом NOT LIKE IN ***)

 

Powered by ExBB FM 1.0 RC1