• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Dodawanie treści do elementu z zapytania dla API

0 głosów
366 wizyt
pytanie zadane 12 kwietnia 2018 w SQL, bazy danych przez Anoonymous Obywatel (1,560 p.)

Mój SQL zwraca taki rezultat:

[
        {
            "date": "2018-04-09T07:01:01.000Z",
            "title": "xxx",
            "description": "xxx"
        },
        {
            "date": "2018-04-09T07:01:01.000Z",
            "title": "yyy",
            "description": "yyy"
        }
]

Chciałbym móc dopisać do każdego elementu dane z innego selecta, tak, aby wynik wyglądał jak powyżej, ale po "description" była jeszcze jedna informacja np. "category" jako tablica (kilka elementów).  Mój kod API:

app.get('/:cat', validator.params(userCat), function (req, res) {
let userCat = req.params.cat;
let itemSQL = "SELECT * FROM tags t INNER JOIN itemtags it ON t.idTag = it.idtag INNER JOIN item i ON it.idItem = i.idItem WHERE t.name = ?";
let tagsSQL = "SELECT name FROM tags WHERE idtag IN ( SELECT it.idtag FROM itemtags it,tags t WHERE it.idtag=t.idtag AND it.iditem= ?)"; 


  connection.query(itemSQL, userCat, function(err, results, fields) {
    if (err) {
      console.log(err);
      res.json({ error: err});
      connection.end()
    }

    for (let i = 0; i < results.length; i++) {

      connection.query(tagsSQL, results[i].idItem, function(err, results2, fields) {
        if (err) {
          console.log(err);
          res.json({ error: err});
          connection.end()
        }

        for (let j = 0; j < results2.length; j++) {

          results[i]{j}.push({"tags": results2[j].name});
        }


      });

    }

    res.json(results);

  });

});

Kod jest niestety błędny, ale chciałem nim ukazać "sposób myślenia". W jaki sposób muszę do tego podejść? Głównym moim problemem jest złączenie/doklejenie wyników z jednego results do results w odpowiednie miejsca dla każdego elementu {}

1 odpowiedź

+1 głos
odpowiedź 12 kwietnia 2018 przez Tomek Sochacki Ekspert (227,490 p.)

Chodzi Ci o coś takiego?

//Pierwszy zestaw danych:
const result1 = [
    {
        "date": "2018-04-09T07:01:01.000Z",
        "title": "xxx",
        "description": "xxx"
    },
    {
        "date": "2018-04-09T07:01:01.000Z",
        "title": "yyy",
        "description": "yyy"
    },
];

//Drugi zestaw danych:
const result2 = [
    {
		"category": [1,2,3],
	},
	{
		"category": [2,3,7],
	},
];

//I teraz łączymy, tj. do result1 dodajemy 
//dla każdego elementu właściwość category:
const result = result1.map((obj,index) => { 
	return {
		...obj, 
		"category": result2[index].category,
	};
});

Tylko, że to troszkę ryzykowne, chyba, że masz pewność co do odpowiedniej kolejności elementów w obu tablicach i jednocześnie równej długości tablic... Ja dałem pomysł na rozwiązanie od strony technicznej, jednocześnie nie modyfikując tablic result1 i result2, ale przemyśl czy na pewno jest to dobry pomysł...

komentarz 13 kwietnia 2018 przez Anoonymous Obywatel (1,560 p.)

Wygląda na dobre, jednak nie umiem zastosować to w moim przypadku - w przypadku result2 dla każdego elementu muszę odpytać bazę:

    for (let i = 0; i < results.length; i++) {

      connection.query(tagsSQL, results[i].idItem, function(err, results2, fields) {
        if (err) {
          console.log(err);
          res.json({ error: err});
          connection.end()
        }

        for (let j = 0; j < results2.length; j++) {

          tags.push(results2[j]);

        }


      });

    }

Jak dobrze rozumiem muszę złączyć wyniki z result2 w jeden aby później móc zastosować twój przykład poza pętlą? 

1
komentarz 13 kwietnia 2018 przez Tomek Sochacki Ekspert (227,490 p.)

a dlaczego musisz tak odpytywać bazę?

Jeśli pobierasz tylko id poszczególnych kategorii jakie ma przypisane dany element to ja użyłbym po prostu funkcji GROUP_CONCAT() i od razu w jednym zapytaniu to dostał, rozdzielając np. poszczególne id przecinkiem, średnikiem itp. i potem po prostu oblecisz otrzymany obiekt metodą split.

Dostałbyś np. 

{
    //jakieś tam dane
    category: "1,2,3,4,5"
}

i po prostu na tym ciągu znakowym wywołaj metodę split(",") i masz ładną tablicę.

Tutaj; SQLFIDDLE robiłem kiedyś dla kogoś innego przykład użycia GROUP_CONCAT() i widoków.

komentarz 13 kwietnia 2018 przez Anoonymous Obywatel (1,560 p.)
Tak odpytuje bazę ponieważ wydawało mi się to poprawne - dzięki za linka postaram się coś podziałać i dam znać jak poszło.
komentarz 13 kwietnia 2018 przez Anoonymous Obywatel (1,560 p.)

Zastanawiam się czy w sposób, który opisałeś można uzyskać wynik bez łączenia ich w jednym zapytaniu do bazy, mam takie dwa zapytania:

SELECT date, title, description, i.idItem FROM tags t INNER JOIN itemtags it ON t.idTag = it.idtag INNER JOIN item i ON it.idItem = i.idItem WHERE t.name = ?
SELECT name FROM tags WHERE idtag IN ( SELECT it.idtag FROM itemtags it,tags t WHERE it.idtag=t.idtag AND it.iditem= ?)

Czy używając group_concat jestem w stanie złączyć owe zapytania w jedno i uzyskać efekt podobny do tego:

[
        {
            "date": "2018-04-09T07:01:01.000Z",
            "title": "xxx",
            "description": "xxx",
            "tags": "1,2,3"
        },
        {
            "date": "2018-04-09T07:01:01.000Z",
            "title": "yyy",
            "description": "yyy",
            "tags": "1,2"
        }
]

W ten sposób uzyskałbym wynik, który mógłbym rozdzielić (',') na frontendzie. Czy to też miałeś na myśli?

Podobne pytania

0 głosów
0 odpowiedzi 914 wizyt
pytanie zadane 29 kwietnia 2017 w JavaScript przez moofi Początkujący (470 p.)
0 głosów
1 odpowiedź 186 wizyt
pytanie zadane 22 stycznia 2018 w JavaScript przez Anoonymous Obywatel (1,560 p.)
0 głosów
1 odpowiedź 249 wizyt
pytanie zadane 4 sierpnia 2017 w JavaScript przez Dar3Q Obywatel (1,200 p.)

93,427 zapytań

142,421 odpowiedzi

322,649 komentarzy

62,787 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...