hente fra samme tabel to gange og derefter fra en anden tabel i samme query
Hej med jer
Endnu en gang må jeg ty til ekspertenes hjælp efter at have rodet med det i mange timer nu.
Jeg skal have listet kommende quiz for de næste 10 dage (quiznavn og startdato) og det skal gøres fra to tabeller.
Tabel 1 "postmeta" har felterne: meta_id, post_id, meta_key, meta_value
Tabel 2 "quiz_master har felterne: id, name, text (og en masse andre uden betydning)
Når en quiz bliver oprettet i databasen, bliver det fordelt over de to tabeller. I "quiz_master" står der navn, beskrivelse og en masse andre ting. I tabellen "postmeta" bliver der oprettet quiz_id for quizzen i en række, startdato for samme quiz i en anden række og slutdato for samme quiz i en tredje række. Altså bliver der oprettet en række i tabellen "quiz_master" og tre rækker i tabellen "postmeta" når en quiz bliver lavet.
I de tre rækker der bliver oprettet i tabellen "postmeta" indeholder felterne:
meta_id: unikke værdier post_id: den samme værdi meta_key: quiz_id, start_date, end_date meta_value: værdien af meta_key
Et eksempel på oprettelse af en quiz kan være:
I quiz_master: id = '111' name = 'den bedste quiz' text = 'Quizzen som har de bedste spørgsmål' osv.
quiz_id: 111 Navn: Den bedste quiz Text: Quizzen som har de bedste spørgsmål Start: 29-12-2016 Slut: 05-01-2017
Så jeg forestiller mig at man bruge SELECT as, Join og DATE BETWEEN i queryen, men jeg kan ikke begribe hvordan jeg skal skrive queryen, når den først skal: - hente rækkerne med de ønskede datoer fra tabellen "postmeta" - tage post_id fra de rækker - hente rækkerne hvor post_id = samme post_id og meta_key = quiz_id fra samme tabel (postmeta) - hente quiz navn og text fra tabellen "quizmaster"
SELECT quiz_master.id,quiz_master.name,quiz_master.text,pm2.meta_value,pm3.meta_value FROM quiz_master JOIN postmeta pm1 ON pm1.meta_key='quiz_id' AND pm1.meta_value=quiz_master.id JOIN postmeta pm2 ON pm2.meta_key='start_date' AND pm2.post_id=pm1.post_id JOIN postmeta pm3 ON pm3.meta_key='end_date' AND pm3.post_id=pm1.post_id
Hej Arne. Tak for det jeg prøvet om jeg kan få strikket det sammen ved hjælp af din kode. Grunden til tabel strukturen ser ud som den gør er, at det ikke kun er quiz, som er registreret i postmeta tabellen. Når det så er sagt, så vil jeg give dig ret i at den skulle laves om. Evt. så det hele trækkes ud fra en tabel. Problemet ligger dog i at den er sammenkædet med en app og det er ikke mig der har lavet hverken app eller databasen. Jeg skal blot have hentet info fra denne database. Men prøver om jeg ikke kan få det til at fungere.
Jeg kan ikke få det til at fungere. Jeg har prøvet med din kode og der vil den godt skrive id, navn og text ud men ikke start_date. (end_date/pm3 har jeg fjernet, da ikke er nødvendigt) Jeg har prøvet at tilføre en SELECT indeni i håb om at kunne trække start_date ud, men uden held. Hvordan kan jeg få trukket startdatoen ud?
Nogen idéer?
Det ser sådan ud nu:
$results_quiz = $pdo->query("SELECT quiz_master.id,quiz_master.name,quiz_master.text,pm2.meta_value, (SELECT meta_value FROM postmeta WHERE postmeta.meta_key = 'startdate') AS startdato FROM quiz_master JOIN postmeta pm1 ON pm1.meta_key='quiz_id' AND pm1.meta_value=quiz_master.id JOIN postmeta pm2 ON pm2.meta_key='start_date' AND pm2.post_id=pm1.post_id");
$results_quiz = $pdo->query("SELECT quiz_master.id,quiz_master.name,quiz_master.text,pm2.meta_value FROM quiz_master JOIN postmeta pm1 ON pm1.meta_key='quiz_id' AND pm1.meta_value=quiz_master.id JOIN postmeta pm2 ON pm2.meta_key='start_date' AND pm2.post_id=pm1.post_id");
i resultat data?
Eller:
$results_quiz = $pdo->query("SELECT quiz_master.id AS id,quiz_master.name AS name,quiz_master.text AS text,pm2.meta_value AS start_date FROM quiz_master JOIN postmeta pm1 ON pm1.meta_key='quiz_id' AND pm1.meta_value=quiz_master.id JOIN postmeta pm2 ON pm2.meta_key='start_date' AND pm2.post_id=pm1.post_id");
Ja pm2.meta_key='start_date' er den rigtige værdi og med den sidste kode du skrev henter den også start datoen :-) Så skal vi bare have den til at kun at hente de rækker som ligger 10 dage frem fra nu.
$results_quiz = $pdo->query("SELECT quiz_master.id AS id,quiz_master.name AS name,quiz_master.text AS text,pm2.meta_value AS start_date FROM quiz_master JOIN postmeta pm1 ON pm1.meta_key='quiz_id' AND pm1.meta_value=quiz_master.id JOIN postmeta pm2 ON pm2.meta_key='start_date' AND pm2.post_id=pm1.post_id WHERE pm2.meta_value < :cutoffdate");
Hehe. Jeg tænkte at da jeg havde lagt indlægget under MySQL var du nok klar over at det var det, så jeg troede du var ude i om det var " flat file data model", "hierarchical database model" eller "network database model" :-D Anyway, ingen af de to virker.. Den henter stadig alle quiz
Vi har denne kode at gå ud fra.. Her virker det sådan at den henter alle quiz med, id navn, text og start_date:
$results_quiz = $pdo->query("SELECT quiz_master.id AS id,quiz_master.name AS name,quiz_master.text AS text,pm2.meta_value AS start_date FROM quiz_master JOIN postmeta pm1 ON pm1.meta_key='quiz_id' AND pm1.meta_value=quiz_master.id JOIN postmeta pm2 ON pm2.meta_key='start_date' AND pm2.post_id=pm1.post_id");
SELECT quiz_master.id AS id,quiz_master.name AS name,quiz_master.text AS text, DATE_FORMAT(STR_TO_DATE('pm2.meta_value', '%e-%c-%Y'), '%Y-%c-%e') AS start_date ?
Når du har mulighed for at teste det (og hvis du har lyst naturligvis) er du velkommen til at vende tilbage. Jeg tror jeg smider håndklædet i ringen for i dag. Mine øjne er ved at blive firkantede og jeg tænker ikke klart mere. Har nu prøvet med alle mulige ændringer og forsøg på at få det til at virke, men uden held.
Andre er selvfølgelig velkommen til at byde ind, hvis løsningen er øjensynlig. :-)
Det kan være at jeg ikke fik forklaret det godt nok. Det skulle gerne være sådan at den henter fra i dag og til og med 10 dage frem. Jeg har ændret datoen til 09-01-2017 og har også en der hedder 10-01-2017 for at se, men den henter ingenting?
WHERE DATE(CONCAT(SUBSTR(pm2.meta_value,7,4),'-',SUBSTR(pm2.meta_value,4,2),'-',SUBSTR(pm2.meta_value,1,2)) BETWEEN NOW() AND DATE_ADD(NOW(), INTERVAL 10 DAY)
med: SELECT NOW(),DATE_ADD(NOW(), INTERVAL 10 DAY) skriver den datoen nu ud og 10 dage frem.
med: SELECT DATE(CONCAT(SUBSTR(meta_value,7,4),'-',SUBSTR(meta_value,4,2),'-',SUBSTR(meta_value,1,2)) FROM postmeta WHERE meta_key='start_date'
skriver den:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FROM postmeta WHERE meta_key='start_date' LIMIT 0,30' at line 1
Jeg har omsider fået den til at hente quiz for de næste 10 dage med denne sql:
$results_quiz = $pdo->query("SELECT qm.id, qm.name, qm.text, pm2.meta_value as start_date FROM quiz_master AS qm JOIN postmeta pm1 ON pm1.meta_key = 'quiz_id' AND pm1.meta_value = qm.id JOIN postmeta pm2 ON pm2.meta_key = 'start_date' AND pm2.post_id = pm1.post_id WHERE STR_TO_DATE(pm2.meta_value,'%d.%m.%Y')>CURDATE() ORDER BY STR_TO_DATE(pm2.meta_value,'%d-%m-%Y') ASC LIMIT 10");
Nu mangler jeg bare at få konverteret datoen så den ser således ud '04.01.2017' i stedet for '04-01-2017'
Arg. Det er så ikke helt sandt. Den printer selvfølgelig kun de første 10 quiz fra dagen efter d.d. Jeg har prøvet med INTERVAL 10 DAYS i stedet for LIMIT 10, men det vil den ikke. Nogen forslag?
Jeg har valgt at holde mig til denne simple løsning, da den dækker mit behov. Den henter de næste 10 quiz fra i morgen og det er helt fint. Tak for kampen arne_v du hjalp mig godt på vej. :-)
$results_quiz = $pdo->query("SELECT qm.id, qm.name, qm.text, pm2.meta_value as start_date FROM quiz_master AS qm JOIN postmeta pm1 ON pm1.meta_key = 'quiz_id' AND pm1.meta_value = qm.id JOIN postmeta pm2 ON pm2.meta_key = 'start_date' AND pm2.post_id = pm1.post_id WHERE STR_TO_DATE(pm2.meta_value,'%d-%m-%Y')>CURDATE() ORDER BY STR_TO_DATE(pm2.meta_value,'%d-%m-%Y') LIMIT 10");
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.