Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Urlin poimiminen tietokantakentästä

Vilijo [23.05.2019 17:05:22]

#

Minulla on nettisivujen pohjalla MySql-tietokanta, jossa on tuotetaulu. Taulussa on yhdessä solussa linkkijä tuotteen kuviin. Samassa solussa on monta linkkiä ja eri määräkin eri tuotteiden kohdalla.

Nyt pitäisi poimia esim VIEWiin ensimmäisen linkin urli. Mitenhän se onnistuisi CREATE VIEW-komennon kanssa, kun solussa ei ole tietyn verran merkkejä ennen urlia ja urlin pituuskin vaihtelee. Tässä parin tietueen tuotekuvasolun sisältö:

TIETUE 1: a:1:{i:0;a:10:{i:0;s:84:"https://www.urliurliurli.net/urliurliurli.net/Image.aspx?id=10595781&full=1";i:1;s:84:"https://www.urliurliurli.net/urliurliurli.net/Image.aspx?id=10595782&full=1";}}
TIETUE 2: a:1:{i:0;a:8:{i:0;s:83:"https://www.urliurliurli.net/urliurliurli.net/Image.aspx?id=5594779&full=1";i:1;s:83:"https://www.urliurliurli.net/urliurliurli.net/Image.aspx?id=5594774&full=1";}}

Jos ei tuolla CREATE VIEWillä onnistu niin kuinka muuten tuon voisi tehdä?
Kiitos avusta :)

Metabolix [24.05.2019 00:48:29]

#

Samaan tietokannan kenttään ei yleensä kuulu tallentaa useaa asiaa. Esimerkiksi tässä tapauksessa olisi järkevää olla erillinen taulu linkeille ja siinä aina tuotteen id ja linkki, jolloin voisi olla erillisinä riveinä useampi linkki samalle tuotteelle. Tällöin yhden linkin saa (nykyaikaisella MySQL- tai MariaDB-versiolla) vaikka tähän tapaan:

-- Yhdelle tuotteelle:
SELECT url FROM tuotekuvat WHERE tuote_id = ? ORDER BY kuvan_numero ASC LIMIT 1;

-- Joka tuotteelle:
SELECT DISTINCT * FROM (
  SELECT
    tuote_id,
    FIRST_VALUE(url) OVER (PARTITION BY tuote_id ORDER BY kuvan_numero ASC)
  FROM tuotekuvat
) AS t;

Ylipäänsä PHP:n serialize-funktiota ei kannata käyttää tiedon tallentamiseen. Jos jostain syystä tuo yhteen kenttään tallentaminen tuntuu omalla kohdalla tarpeelliselta, ainakin kannattaa käyttää JSON-muotoa. Tällöin tietoa voi hakea JSON-funktioilla:

-- Tallennetaan osoitteet JSON-muodossa:
UPDATE tuote SET kuvat = '["url1", "url2"]';

-- Ensimmäisen osoitteen haku JSON-muodosta:
SELECT JSON_UNQUOTE(JSON_EXTRACT(kuvat, '$[0]')) FROM tuote;

Nykyisestä datastasi sen sijaan joutuisit poimimaan tiedon yhdistelemällä funktioita SUBSTRING ja SUBSTRING_INDEX, mutta tätä lähestymistapaa ei voi mitenkään suositella. Ylipäänsä PHP:n oma serialisointimuoto ei ole järkevä tapa tiedon tallentamiseen.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta