2013-05-30 5 views
0

Возможно, это было задано, но поскольку я являюсь массивным PHP/MySQL noob, я действительно не знаю, что я ищу. Я, выполнив следующий запрос:Подзапрос PHP/MySQL возвращает более 1 строки

SELECT shortlink_analytics.shortlink AS short, 
COUNT(shortlink_analytics.shortlink) AS shortcount, 
(SELECT link FROM shortlinks WHERE shortlinks.shortlink = shortlink_analytics.shortlink) AS shLink 
FROM shortlink_analytics JOIN shortlinks ON shortlink_analytics.shortlink = shortlinks.shortlink 
GROUP BY shortlink_analytics.shortlink 
ORDER BY COUNT(shortlink_analytics.shortlink) DESC LIMIT 10 

Это используется для работы, но, пересматривал на прошлой неделе я заметил, что на выходе, вместо работы, показал ошибку:

Subquery returns more than 1 row 

После играя с кодом мне удалось найти, что проблема лежит (я думаю!) в области (но я не совсем уверен):

GROUP BY shortlink_analytics.shortlink 
ORDER BY COUNT(shortlink_analytics.shortlink) DESC LIMIT 10 

ли кто-нибудь сможет объяснить:

  • , где я поступил не так?
  • Возможная причина, почему он работал месяц, а затем он прекратил работать?
  • Каков будет способ исправить мою проблему?
+0

Почему бы не использовать 'ВНУТРЕННЕЙ JOIN' заменить эту часть' ВЫБРАТЬ ссылку FROM WHERE shortlinks.shortlink коротких ссылок = shortlink_analytics.shortlink'. Это делает ваш запрос более читаемым и, вероятно, лучше работает ... –

ответ

3

Эта часть подзапрос:

(SELECT link FROM shortlinks WHERE shortlinks.shortlink = shortlink_analytics.shortlink)

Может вы просто LIMIT это 1 ряд?

(SELECT link FROM shortlinks WHERE shortlinks.shortlink = shortlink_analytics.shortlink LIMIT 1)

Вы должны попытаться выяснить, почему ваши данные возвращаются несколько строк, и вы можете даже не нужно ORDER BY, чтобы убедиться, что правильно строка возвращается.

+0

Привет, это исправило мою проблему. Но могли бы вы еще больше расширить, почему это сработало несколько недель назад, но потом остановилось? –

+3

@SamStreet. , , Поскольку данные изменились, и теперь появились дубликаты. –

1

Если вы хотите, чтобы получить все ссылки на отношения, используйте group_concat():

SELECT shortlink_analytics.shortlink AS short, 
     COUNT(shortlink_analytics.shortlink) AS shortcount, 
     group_concat(link) as shlinks 
FROM shortlink_analytics JOIN 
    shortlinks ON 
    shortlink_analytics.shortlink = shortlinks.shortlink 
GROUP BY shortlink_analytics.shortlink 
ORDER BY COUNT(shortlink_analytics.shortlink) 
DESC LIMIT 10; 

Если это предположение неверно, и вам нужно подзапрос, вы все равно можете получить все ссылки, выполнив group_concat() в подзапрос:

SELECT shortlink_analytics.shortlink AS short, 
     COUNT(shortlink_analytics.shortlink) AS shortcount, 
     (SELECT group_concat(link) 
     FROM shortlinks 
     WHERE shortlinks.shortlink = shortlink_analytics.shortlink 
     ) AS shLinks 
FROM shortlink_analytics JOIN 
    shortlinks 
    ON shortlink_analytics.shortlink = shortlinks.shortlink 
GROUP BY shortlink_analytics.shortlink 
ORDER BY COUNT(shortlink_analytics.shortlink) DESC 
LIMIT 10 
Смежные вопросы