2014-12-08 3 views
-1

Я бегу запросов и получаю следующее сообщение об ошибке: PHP Warning: mysqli::query(): (21000/1242): Subquery returns more than 1 rowВнимание: MySQLi :: запрос(): (21000/1242): подзапрос возвращает более чем на 1 строку

Когда я бросаю эти запросы в PhpMyAdmin, Я получаю сообщение: #2014 - Commands out of sync; you can't run this command now

PHP версии 5.5.18, MySql Версия 5.6.21

Bad Query

select *, 
    (select stime 
    from racetype_standards 
    where eventID = 8 and stypeID=st.id and gender = 2 and division = 1) 
    as standscore, 
    (select floor(stime/60) 
    from racetype_standards 
    where eventID = 8 and stypeID=st.id and gender = 2 and division = 1) 
    as standminutes, 
    (select (stime % 60) 
    from racetype_standards 
    where eventID = 8 and stypeID=st.id and gender = 2 and division = 1) 
    as standseconds, 
    (select substring_index(stime, '.', -1) 
    from racetype_standards 
    where eventID = 8 and stypeID=st.id and gender = 2 and division = 1) 
    as standhunds, 
    (select ecomment 
    from racetype_standards 
    where eventID = 8 and stypeID=st.id and gender = 2 and division = 1) 
    as ecomm 
    from standards_type st 
    where active = 1 
    order by displayOrder 

Хороший запрос

select *, 
    (select stime 
    from racetype_standards 
    where eventID = 7 and stypeID=st.id and gender = 2 and division = 1) 
    as standscore, 
    (select floor(stime/60) 
    from racetype_standards 
    where eventID = 7 and stypeID=st.id and gender = 2 and division = 1) 
    as standminutes, 
    (select (stime % 60) 
    from racetype_standards 
    where eventID = 7 and stypeID=st.id and gender = 2 and division = 1) 
    as standseconds, 
    (select substring_index(stime, '.', -1) 
    from racetype_standards 
    where eventID = 7 and stypeID=st.id and gender = 2 and division = 1) 
    as standhunds, 
    (select ecomment 
    from racetype_standards 
    where eventID = 7 and stypeID=st.id and gender = 2 and division = 1) 
    as ecomm 
    from standards_type st 
    where active = 1 
    order by displayOrder 
+0

В чем вопрос? PS: пожалуйста, отформатируйте свои запросы как многострочные. – zerkms

+0

Так что с 'eventID = 7' и другими условиями вы получаете только одно совпадение, но с' eventId = 8' существует более одного ... и, как говорится в сообщении об ошибке: вы можете иметь подзапросы, возвращающие одну строку при использовании их в списке полей выбора –

+0

Я не понимаю, как хороший запрос относится к остальной части начального сообщения. Может быть, это нужно уточнить. – tvCa

ответ

1

Каждый из них:

(select stime 
    from racetype_standards 
    where eventID = 8 and stypeID=st.id and gender = 2 and division = 1) 

должны решить ровно одну строку - там не может быть двух строк, которые удовлетворяют этим критериям для любого данного st.id. Если - это две строки, вам необходимо сгруппировать по st.id в каждом внутреннем запросе и как-то суммировать stime (например, выбрать max(stime)) и то же самое для каждого из других подзапросов.

Альтернативно, постройте это совсем по-другому - возможно, выполнив объединение - если вы хотите иметь возможность возвращать несколько строк для каждой строки racetype_standards. В целом, это очень трудно поддерживать запрос, потому что он делает то же самое 5 раз [в основном] - это было бы много короче, если вы изменили его, чтобы только один раз этот подзапрос (например, соединение). В моем чаще используемом аромате SQL я бы выполнил подзапрос один раз, а затем ссылаюсь на вновь созданный столбец, чтобы делать все остальные биты, например (не уверен, что это возможно в mysql); кроме того, я бы только один раз вытащил время и оставил бы его до создателя текстового объекта (т. е. PHP), чтобы построить минуты/секунды/что-то не по себе - гораздо меньше кода для поддержки.

Однако, в любом случае, я попытался бы сделать это соединение - похоже, вам в конечном итоге понадобится все различные eventIDs? Просто потяните за стол вниз, а затем справляйтесь с ним оттуда.

Смежные вопросы