• 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

Object Storage Arubacloud
0 głosów
251 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,510 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,510 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 776 wizyt
pytanie zadane 29 kwietnia 2017 w JavaScript przez moofi Początkujący (470 p.)
0 głosów
1 odpowiedź 148 wizyt
pytanie zadane 22 stycznia 2018 w JavaScript przez Anoonymous Obywatel (1,560 p.)
0 głosów
1 odpowiedź 178 wizyt
pytanie zadane 4 sierpnia 2017 w JavaScript przez Dar3Q Obywatel (1,200 p.)

92,565 zapytań

141,417 odpowiedzi

319,601 komentarzy

61,950 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...