Почему не удается получить все объекты на пути из базы данных firebase в ответ? [Дубликат]

Вы можете использовать агрегированную функцию GROUP_CONCAT , чтобы получить все годы в один столбец, сгруппированный по id и упорядоченный по rate:

SELECT   id, GROUP_CONCAT(year ORDER BY rate DESC) grouped_year
FROM     yourtable
GROUP BY id

Результат:

-----------------------------------------------------------
|  ID | GROUPED_YEAR                                      |
-----------------------------------------------------------
| p01 | 2006,2003,2008,2001,2007,2009,2002,2004,2005,2000 |
| p02 | 2001,2004,2002,2003,2000,2006,2007                |
-----------------------------------------------------------

И тогда вы можете использовать FIND_IN_SET , который возвращает позицию первого аргумента во втором, например.

SELECT FIND_IN_SET('2006', '2006,2003,2008,2001,2007,2009,2002,2004,2005,2000');
1

SELECT FIND_IN_SET('2009', '2006,2003,2008,2001,2007,2009,2002,2004,2005,2000');
6

Используя комбинации GROUP_CONCAT и FIND_IN_SET и фильтрации по позиции, возвращаемой find_in_set, вы можете использовать этот запрос, который возвращает только первые 5 лет для каждого id:

SELECT
  yourtable.*
FROM
  yourtable INNER JOIN (
    SELECT
      id,
      GROUP_CONCAT(year ORDER BY rate DESC) grouped_year
    FROM
      yourtable
    GROUP BY id) group_max
  ON yourtable.id = group_max.id
     AND FIND_IN_SET(year, grouped_year) BETWEEN 1 AND 5
ORDER BY
  yourtable.id, yourtable.year DESC;

См. скрипку здесь .

Обратите внимание, что если более чем одна строка может иметь одинаковую скорость, вы должны рассмотреть возможность использования GROUP_CONCAT (DISTINCT rate ORDER BY rate) в столбце скорости вместо столбца года .

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

-1
задан Tholle 13 July 2018 в 20:12
поделиться

2 ответа

Вы устанавливаете state.messages = [] в функции удаления.

1
ответ дан EECOLOR 17 August 2018 в 11:30
поделиться
  • 1
    Я сделал так, пока он не работает – Joby Mathew 14 July 2018 в 05:43
  • 2
    Это означает, что при вызове remove все сообщения очищаются. – EECOLOR 14 July 2018 в 06:00
  • 3
    Но когда я перехожу назад, мне нужно получить все элементы, которые уже есть в объекте, вместо этого я получаю только последние данные в виде журнала консоли: (2) [{...}, {...}] 0: {текст: {...}, id: "-LHK9aJ7wmeSt0spqbLi"} 1: {text: {...}, id: "-LHM9najplQCSI92Utqc"} length: 2__proto__: Array (0) Announcement.js: 24 [] Vendor.js: 181 [] Vendor.js : 181 [] Vendor.js: 181 – Joby Mathew 14 July 2018 в 06:11
  • 4
    Без функционального (минимального) примера, демонстрирующего вашу проблему, почти невозможно помочь вам решить проблему. Пожалуйста, обновите свой вопрос с полным минимальным примером, который показывает проблему. В этом примере удалите ненужный код. – EECOLOR 14 July 2018 в 06:14
  • 5
    Хорошо, я сделаю это – Joby Mathew 14 July 2018 в 13:54

Помните, что setState() является асинхронной задачей, поэтому ваш код может не работать должным образом из-за условий гонки, а ваше состояние будет перезаписано.

Итак, вы можете инкапсулировать свою логику в такой функции:

loadData() {
  const messagesRef = fire
    .database()
    .ref("vendor/" + this.state.Day + "/" + this.state.Vendor + "/dishname")
    .orderByKey()
    .limitToLast(100);
  messagesRef.on("child_added", snapshot => {
    const message1 = { text: snapshot.val(), id: snapshot.key };
    console.log(this.state.messages);
    this.setState({
      // ...this.state, <-- You can ommit this, as you are only interested in 
      //                     setting the messages property
      messages: this.state.messages.concat(message1)
    });
  });
}

, а затем вызвать ее в componentDidMount, как это, используя функциональность обратного вызова setState:

componentDidMount() {
  this.setState({ ...this.state}, () => this.loadData());
}
2
ответ дан Rodrigo Mata 17 August 2018 в 11:30
поделиться
  • 1
    Он все еще не работает. В журнале консоли после перехода с другой страницы он возвращается как пустой объект: – Joby Mathew 14 July 2018 в 05:49
  • 2
    (2) [{...}, {...}] 0: {текст: {...}, id: & quot; -LHK9aJ7wmeSt0spqbLi & quot;} 1: {текст: {...}, id: "-LHM9najplQCSI92Utqc & quot;} длина: 2__proto__: Array (0) Announcement.js: 24 [] Vendor.js: 181 [] Vendor.js: 181 [] Vendor.js: 181 – Joby Mathew 14 July 2018 в 05:50
  • 3
    Можете ли вы попробовать настроить состояние в методе удаления следующим образом: this.setState({ messages: messages.filter(msg => msg.id !== id) });? – Rodrigo Mata 17 July 2018 в 14:26
  • 4
    Это не работает – Joby Mathew 18 July 2018 в 10:53
Другие вопросы по тегам:

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