login  Naam:   Wachtwoord: 
Registreer je!
 Forum
Zoeken  Regels  Help
Categorieën > PHP & SQL

MySQL data output

Pieter – 22/09/2011 11:44
Een goeie middag,

Ik heb een WordPress database waar ik wat plugin gegevens uit wil outputten met een custom SQL string, maar ik raak er maar niet uit hoe ik het aantal sql aanvragen kan verkleinen.

Dit is een vb van de databasestructuur: Screenshot

Zoals je ziet wordt er gewerkt met een sub_id. Ik zou de data willen outputten met een foreach per sub_id.
Kan iemand me een richting aanwijzen hoe ik dit kan doen zonder per foreach een nieuwe sql request te moeten maken?

Dit is wat ik momenteel heb:
  1. <?php
  2. $cosplayers = $wpdb->get_results(
  3. "
  4. SELECT *
  5. FROM $wpdb->cformsdata
  6. "
  7. );
  8. echo '<h3>Saturday</h3><table>';
  9. foreach ( $cosplayers as $cosplayer )
  10. {
  11. if (($cosplayer->field_val=='Saturday') && ($cosplayer->field_name=='Day')){
  12. echo '<tr>';
  13. echo '<td>';
  14. echo $cosplayer->sub_id;
  15. echo '<td>';
  16. echo '</tr>';
  17. }
  18. }
  19. echo '</table>';
  20. ?>


Heel simpel dus, hij haalt enkel de sub_id op als de ingevulde dag zaterdag is.
Aan de database structuur kan ik niets wijzigen, gezien het een onderdeel is van de CformsII plugin.

Bedankt alvast.  

8 antwoorden

Gesponsorde links
Daisycon - Verdien geld met uw website

Ontani – 22/09/2011 11:50
Welke data moet er opgehaald worden aan de hand van de sub_id? Want wat je nu toont lijkt me enkel stap 1. "Ik zou de data willen outputten met een foreach per sub_id." wordt hier nergens beschreven.

Pieter – 22/09/2011 12:14
Ik raak momenteel niet verder dan stap 1, ik heb de sub_id van de data die ik wil outputten. De data zelf is de data die in field_val en field_name staan (praktisch alle data die er vermeld wordt per sub_id)

Het zou fijn zijn moest ik een grote array kunnen krijgen met sub_id, page, email,... etc. Daarmee weet ik wel hoe ik het verder verwerk tot een net leesbare html output.

Ik zou het kunnen oplossen door tussen elke foreach terug een sqlconnect te maken en te kijken wat er staat bij element met een bepaalde sub_id, maar als dit 1000 keer moet gebeuren, kan ik niet geloven dat dit de meest efficiënte oplossing is. 

marten – 22/09/2011 12:45
Wat je kan doen is de waardes aan elkaar zetten dus bv CONCAT('veld1||||veld2||||veld3') vervolgens exploden op de |||| ( of andere seperator )
of je kan een subquery gaan gebruiken.

Pieter – 22/09/2011 13:51
@Marten,

Het is vooral performance gericht dat ik ermee zit: als ik met een subquery werk, dan is dat voor een 1000tal keer. Is dat wel ok voor een site die ±2000 bezoekers per dag heeft naar performance toe? (1000*2000 = best wel wat aanvragen)

Bij de Concat oplossing, dan zit ik met gegevens die aan elkaar geplakt zijn. Op welke basis zou ik dit dan gemakkelijk kunnen weergeven?

Liefst zou ik een array krijgen in de zin van
Array([sub_id]=>'1', [Day]=>'Saturday', [Email]=>'...@telenet.be')
waar achteraf gemakkelijk mee te werken valt, maar ik weet niet hoe ik het in dergelijke array duw.

Er staan in de database een ook een heel aantal gegevens die ik niet nodig heb. Enkel de gegevens met de sub_id van de zaterdag zijn nodig.

Stijn – 22/09/2011 22:31
Begrijp ik het goed dat je enkel de records wilt ophalen waar de waarde "Saterday" is in field_val en "Day" in field_name? Want dit is toch maar een simpele where clause toch... En als dat performance moet hebben, moet je de juiste indexen maken op je tabel . De where clauses gaan stukken rapper gaan als er een index is. Bv een index maken op de kolommen "field_val" en "field_name" en dan in je where clause eerst de field_val kolom gebruiken en dan field_name kolom.

Ontani – 22/09/2011 22:43 (Laatst gewijzigd op 22/09/2011 22:44)
Het lijkt me niet meer dan een select met field_name = 'Day' and field_value = 'Saturday'

Pieter – 23/09/2011 09:16 (Laatst gewijzigd op 23/09/2011 09:17)
Klopt, maar dan heb ik toch enkel de gegevens van die rij? Terwijl ik de gegevens van de rijen erboven ook nodig heb (enkel met gelijke sub_id als de rij waar field_value zaterdag is.)

In mijn codevoorbeeld heb ik momenteel de sub_id's geoutput waar ook de andere gegevens van nodig zijn. Dat zou ik kunnen doen door dan elke keer per sub_id een select te maken en zo de gegevens binnen te trekken, maar dat lijkt me wat omslachtig en traag, niet?

@Stijn, met die indexen heb ik nul ervaring, maar ik zoek het even op als ik iets daarmee kan fabriceren.

Thnx alvast om mee te denken.

Stijn – 23/09/2011 15:31 (Laatst gewijzigd op 23/09/2011 15:34)
Indexen helpen je queries om sneller records te vinden. Precies zoals de index van een boek achteraan . Het woord "Aap" staat op pagina 1 en 2 bijv. Bij index gaat dat dan zijn record 1 en 2.

Je zal met een subquery moeten werken.

  1. SELECT * FROM $wpdb->cformsdata WHERE sub_id = (SELECT sub_id FROM $wpdb->cformsdata WHERE field_name = 'Day' AND field_value = 'Saturday')

.

Je kan sub_id = (...) ook vervangen door sub_id IN (...). Dat is wss veiliger als je meerdere sub_id's terug krijgt van die subquery.

Note over index'en. Heb daar leren mee werken op mijn werk. Zo'n index helpt niets als het gaat om 10 records maar wel als het gaat om 100tal records. Die select van jou zal nu record per record zoeken tot hij iets gevonden heeft dat voldoet aan je WHERE clause. Door een index te maken met de kolommen (let op volgorde) field_name en field_value, zal je subquery héél snel uitvoeren. Dan mogen er nog 2000 request op komen .

Gesponsorde links

Je moet ingelogd zijn om een reactie te kunnen posten.
Actieve forumberichten:

© 2002-2012 Sitemasters.be - Regels - Gehost door: Vircon - Laadtijd: 0.065s