login  Naam:   Wachtwoord: 
Registreer je!
 Forum

MySQL data output

Offline Pieter - 22/09/2011 11:44
Avatar van PieterGouden medaille

SEO guru
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
Offline Ontani - 22/09/2011 11:50
Avatar van Ontani Gouden medailleGouden medailleGouden medailleGouden medaille

-1
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.
Bedankt door: Pieter
Offline Pieter - 22/09/2011 12:14
Avatar van Pieter Gouden medaille

SEO guru
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. 
Offline marten - 22/09/2011 12:45
Avatar van marten Beheerder 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.
Bedankt door: Pieter
Offline Pieter - 22/09/2011 13:51
Avatar van Pieter Gouden medaille

SEO guru
@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.
Offline Stijn - 22/09/2011 22:31
Avatar van Stijn PHP expert 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.
Bedankt door: Pieter
Offline Ontani - 22/09/2011 22:43 (laatste wijziging 22/09/2011 22:44)
Avatar van Ontani Gouden medailleGouden medailleGouden medailleGouden medaille

-1
Het lijkt me niet meer dan een select met field_name = 'Day' and field_value = 'Saturday'
Offline Pieter - 23/09/2011 09:16 (laatste wijziging 23/09/2011 09:17)
Avatar van Pieter Gouden medaille

SEO guru
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.
Offline Stijn - 23/09/2011 15:31 (laatste wijziging 23/09/2011 15:34)
Avatar van Stijn PHP expert 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 .
Bedankt door: Pieter
Gesponsorde links
Je moet ingelogd zijn om een reactie te kunnen posten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.71s