• 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

VPS Starter Arubacloud
0 głosów
247 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 770 wizyt
pytanie zadane 29 kwietnia 2017 w JavaScript przez moofi Początkujący (470 p.)
0 głosów
1 odpowiedź 145 wizyt
pytanie zadane 22 stycznia 2018 w JavaScript przez Anoonymous Obywatel (1,560 p.)
0 głosów
1 odpowiedź 174 wizyt
pytanie zadane 4 sierpnia 2017 w JavaScript przez Dar3Q Obywatel (1,200 p.)

92,454 zapytań

141,263 odpowiedzi

319,099 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...