MySQL: представление с подзапросом в ОТ ограничения пункта

Другое событие NullPointerException возникает, когда объявляется массив объектов, а затем сразу же пытается разыменовать его внутри.

String[] phrases = new String[10];
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}

Этот конкретный NPE можно избежать, если порядок сравнения отменяется ; а именно, использовать .equals для гарантированного непустого объекта.

Все элементы внутри массива инициализируются их общим начальным значением ; для любого типа массива объектов, это означает, что все элементы null.

Вы должны инициализировать элементы в массиве перед доступом или разыменованием их.

String[] phrases = new String[] {"The bird", "A bird", "My bird", "Bird"};
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}

58
задан Deduplicator 4 June 2015 в 01:59
поделиться

3 ответа

Не мог запрос в Вашем комментарии просто быть записанным как:

SELECT u1.name as UserName from Message m1, User u1 
  WHERE u1.uid = m1.UserFromID GROUP BY u1.name HAVING count(m1.UserFromId)>3

, Который должен также помочь с известными проблемами скорости с подзапросами в MySQL

18
ответ дан Lightness Races with Monica 24 November 2019 в 18:53
поделиться

Это, кажется, известная проблема.

http://dev.mysql.com/doc/refman/5.1/en/unnamed-views.html

http://bugs.mysql.com/bug.php?id=16757

Многие В запросах могут быть переписаны как (оставил внешним), соединения и (НЕ) ПУСТОЙ какой-то. например

SELECT * FROM FOO WHERE ID IN (SELECT ID FROM FOO2)

может быть переписан, как

SELECT FOO.* FROM FOO JOIN FOO2 ON FOO.ID=FOO2.ID

или

SELECT * FROM FOO WHERE ID NOT IN (SELECT ID FROM FOO2)

может быть

SELECT FOO.* FROM FOO 
LEFT OUTER JOIN FOO2 
ON FOO.ID=FOO2.ID WHERE FOO.ID IS NULL
5
ответ дан ConroyP 24 November 2019 в 18:53
поделиться

У меня была такая же проблема. Я хотел создать представление для отображения информации за последний год из таблицы с записями с 2009 по 2011 год. Вот исходный запрос:

SELECT a.* 
FROM a 
JOIN ( 
  SELECT a.alias, MAX(a.year) as max_year 
  FROM a 
  GROUP BY a.alias
) b 
ON a.alias=b.alias and a.year=b.max_year

Схема решения:

  1. создать представление для каждого подзапроса
  2. заменить подзапросы этими представлениями

Вот запрос решения:

CREATE VIEW v_max_year AS 
  SELECT alias, MAX(year) as max_year 
  FROM a 
  GROUP BY a.alias;

CREATE VIEW v_latest_info AS 
  SELECT a.* 
  FROM a 
  JOIN v_max_year b 
  ON a.alias=b.alias and a.year=b.max_year;

Он отлично работает на mysql 5.0.45, без особого ущерба для скорости (по сравнению с выполнением оригинального подзапроса select без каких-либо представлений).

80
ответ дан 24 November 2019 в 18:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: