Ja zoiets vermoed ik ook al. Hij gaat, denk ik, een relatie zoeken waarmee de where clause overeenstemt. Dus hij zoekt ook in de lege tabel een record met ID='2', die dus niet bestaat en dus oneindig lang gaat zoeken?quote:Op dinsdag 3 april 2012 10:07 schreef Scorpie het volgende:
Volgens mij is je gebundelde query niet hetzelfde als je drie verschillende queries.
Dit.quote:Op dinsdag 3 april 2012 10:07 schreef Scorpie het volgende:
Volgens mij is je gebundelde query niet hetzelfde als je drie verschillende queries.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | SELECT TOP 1 t.IETS1, t.IETS2 FROM TABEL1 AS t WHERE t.ID='2' SELECT TOP 1 q.IETS3 FROM TABEL2 AS q WHERE q.ID='2' SELECT TOP 1 s.IETS4 s.IETS5 s.IETS6 FROM TABEL3 AS s WHERE s.ID='2' |
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | SELECT veld1 veld2 FROM tabel1 WHERE id='2' LIMIT 1 UNION SELECT veld3 FROM tabel2 WHERE id='2' LIMIT 1 UNION SELECT veld4 veld5 veld6 FROM tabel3 WHERE id='2' LIMIT 1 |
quote:* The number of columns in each SELECT statement has to be the same .
* The data type of the column in the column list of the SELECT statement must be the same or at least convertible.
I knowquote:Op dinsdag 3 april 2012 10:16 schreef stefanhaan het volgende:
[..]
Dit.
Allereerst je tabel namen in een enkele query is nergens voor nodig. Dus maak het je niet onnodig lastig dat je alle velden vanuit je query via t.** moet benaderen maar gewoon **.
De TOP tag werkt alleen in SQL server (Dacht ik) dus kan je beter LIMIT gebruiken doet exact hetzelfde en is vrijwel overal ondersteunt.
[ code verwijderd ]
=>
[ code verwijderd ]
Alleen hou deze restricties in je achterhoofd:
[..]
Gedaan, had geen effect, hoewel ik wel idd dacht dat dit zou werken.quote:
Dan zou je net zo goed de 3 query's afzonderlijk kunnen doen of via een JOIN. Maar ik weet niet waarvoor je het wil gebruiken dus wat meer info misschien?quote:* The number of columns in each SELECT statement has to be the same .
* The data type of the column in the column list of the SELECT statement must be the same or at least convertible.
Klopt de drie queries kan ik ook afzonderlijk doen. Alleen wil ik het netwerkverkeer minimaliseren. Wat ik nu eerst dus wil doen is gewoon de resultaten van de 3 queries combineren, achter elkaar zetten dus. Zodat ik het resultaat daarna in 1 brok wordt verstuurd i.p.v. 3 brokken. Daarna gooi ik de boel nog in een storedprocedure.quote:Op dinsdag 3 april 2012 10:24 schreef stefanhaan het volgende:
Daarom poste ik ook dit.
[..]
Dan zou je net zo goed de 3 query's afzonderlijk kunnen doen of via een JOIN. Maar ik weet niet waarvoor je het wil gebruiken dus wat meer info misschien?
Sowieso als je alleen de top 5 resultaten terug laat sturen. Vind er vrijwel geen netwerkverkeer plaats omdat je maar 15 rows retourneerd ipv 15000 bv. Dus is het in dit geval wel verwaarloosbaar.quote:Op dinsdag 3 april 2012 10:33 schreef Dale. het volgende:
[..]
Klopt de drie queries kan ik ook afzonderlijk doen. Alleen wil ik het netwerkverkeer minimaliseren. Wat ik nu eerst dus wil doen is gewoon de resultaten van de 3 queries combineren, achter elkaar zetten dus. Zodat ik het resultaat daarna in 1 brok wordt verstuurd i.p.v. 3 brokken. Daarna gooi ik de boel nog in een storedprocedure.
Ik had net ook nog geprobeerd met een FULL OUTER JOIN maar daarbij zelfde resultaat.
True maar niet als er grofweg 10.000 pc's dit iedere 5 seconde gaan doenquote:Op dinsdag 3 april 2012 10:36 schreef stefanhaan het volgende:
[..]
Sowieso als je alleen de top 5 resultaten terug laat sturen. Vind er vrijwel geen netwerkverkeer plaats omdat je maar 15 rows retourneerd ipv 15000 bv. Dus is het in dit geval wel verwaarloosbaar.
Zelfs dan valt het nog mee mits goede server.quote:Op dinsdag 3 april 2012 10:38 schreef Dale. het volgende:
[..]
True maar niet als er grofweg 10.000 pc's dit iedere 5 seconde gaan doen
Die is er niet maar goedquote:Op dinsdag 3 april 2012 10:41 schreef stefanhaan het volgende:
[..]
Zelfs dan valt het nog mee mits goede server.
Okee! En ja sorry ik heb het database schema niet gemaaktquote:Op dinsdag 3 april 2012 10:50 schreef GlowMouse het volgende:
Andere oplossingen worden echt lelijk
hoofdletters als tabel-/kolomnamen zijn echt lelijk
SELECT t.IETS1,t.IETS2,q.IETS3,q.IETS4
FROM TABEL1 AS t
LEFT JOIN TABEL 2 AS q ON(q.ID=2)
WHERE t.ID=2
LIMIT 1
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | ----------- | a1 | a2 | ----------- ---------------- | b1 | b2 | b3 | ---------------- ------ | c1 | ------ Wordt ------------------------------- | a1 | a2 | b1 | b2 | b3 | c1 | ------------------------------- |
Dat zou idd werken helaas merk ik net dat ik dan nog tegen een conversie fout aanloopquote:Op dinsdag 3 april 2012 10:54 schreef GlowMouse het volgende:
Het is mooier om, als je maar één kolom hebt en bij een andere twee kolommen, toch UNION te gebruiken en dan ipv select veld1 te doen: select veld1,0
Oke thanks. Dan gewoon maar een loopje en in de programmeertaal mergen.quote:Op dinsdag 3 april 2012 11:35 schreef GlowMouse het volgende:
Nee dat kan niet. De methode van joinen is het enige alternatief op union dat ik kan bedenken.
| 1 2 | $var = false; $arr = array("key" => $var['key']); |
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | SELECT TOP 1 t.iets1, t.iets2, NULL FROM tabel1 AS t WHERE t.id=2 UNION ALL SELECT TOP 1 q.iets3, NULL, NULL FROM tabel2 AS q WHERE q.id=2 UNION ALL SELECT TOP 1 s.iets4 s.iets5 s.iets6 FROM tabel3 AS s WHERE s.id=2 |
Dat lijkt me wel de beste oplossing. En het simpelst om te implementeren.quote:Op donderdag 5 april 2012 11:48 schreef Catch22- het volgende:
koppeltabel maken?
product_id | accessoire_id
?
en dan een gecombineerde sleutel maken
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | productentabel | id | productnaam | | 1 | Apparaat 1 | | 2 | Apparaat 2 | | 3 | Apparaat 3 | | 4 | Accessoire 1 | | 5 | Accessoire 2 | Dus als accessoire 1 bij product 2 en 3 hoort en accessoire 2 bij product 1 en 2 dan zal het als volgt moeten in een relatietabel? productenrelatiestabel | id | accessoire_id | gerelateerd_product_id | | 1 | 4 | 2 | | 2 | 4 | 3 | | 3 | 5 | 1 | | 4 | 5 | 2 | |
quote:Op donderdag 5 april 2012 13:06 schreef GlowMouse het volgende:
maar dan zonder id in de tweede tabel
Dus 'id' is niet verplicht in een tabel? Nou mooi, kan die weg.quote:Op donderdag 5 april 2012 13:09 schreef Catch22- het volgende:
en je maakt van accessoire_id en product_id (niet gerelateerd_product_id) een composite key. Hiermee dwing je uniqueness af.
Met een koppeltabel geef je aan welke 2 entiteiten bijelkaar horen. Deze combinatie is uniek. Dit stel je in door een composite key te gebruiken. Hierdoor heeft die rij niet nog een eigen id nodig, want zijn unique identifier is de composite keyquote:Op donderdag 5 april 2012 13:33 schreef Crutch het volgende:
[..]
[..]
Dus 'id' is niet verplicht in een tabel? Nou mooi, kan die weg.![]()
En wat Catch22- zegt, bedoel je daarmee dat ik een kolom moet toevoegen waarin ik aangeef bij welk product(id) deze niet hoort?
Wat is daar het praktisch nut van?
Oh, lol. Die kolomnamen zijn hier puur ter illustratie.quote:Op donderdag 5 april 2012 13:55 schreef KomtTijd... het volgende:
hij bedoelt dat het woordje "gerelateerd" een beetje onzinnige toevoeging is aan de kolom-naam. Beter weglaten.
En als tweede bedoelt hij, dat je een key ook over meerdere kolommen kan defineren. Daarom is de kolom ID overbodig. Aangezien de combinatie [accessoire_id + product_id] sowieso al uniek is.
Je hebt 2 hoofdtabellen:quote:Op donderdag 5 april 2012 14:05 schreef Crutch het volgende:
Maar hoe werkt zo'n composite key?
Kan iemand mij een voorbeeld geven?
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | SELECT Users.*, Rights.name FROM Users INNER JOIN UserRights ON UserRights.user_id = Users.id INNER JOIN Rights ON Rights.id = UserRights.right_id WHERE Users.id = 1 |
quote:Op donderdag 5 april 2012 14:05 schreef Crutch het volgende:
Maar hoe werkt zo'n composite key?
Kan iemand mij een voorbeeld geven?
| 1 2 3 4 5 6 | CREATE TABLE `user_rights` ( `user_id` INT NOT NULL , `right_id` INT NOT NULL , PRIMARY KEY(`user_id`, `right_id`) , INDEX (`right_id`) ); |
| 1 2 3 4 5 6 | SELECT parent.name AS parentName, products.* FROM nested_menu AS node, nested_menu AS parent, produkten AS products WHERE node.lft BETWEEN parent.lft AND parent.rgt AND node.menu_id = products.product_menu AND products.highlight=1 GROUP BY product_id ORDER BY parentName, first_price ASC |
| 1 | AND node.lft > parent.lft IF product_id <van deze rij> != product_id <vorige rij> |
Je kunt hier even kijken (al lijkt je query er al een beetje op)quote:Op donderdag 5 april 2012 23:07 schreef Swetsenegger het volgende:
Ik heb weer eens een query vraagje.
Ik heb een nested set model en nu wil ik van een bepaald groepjes nodes de parent naam achterhalen
[ code verwijderd ]
Dit werkt bijna Het gaat mis bij nodes die 2 niveaus diep zitten.
aan deze query moet een where worden toegevoegd:
[ code verwijderd ]
is dit uberhaupt mogelijk?
Is het niet makkelijker om te stellen dat node.id != parent.id ? Volgens mij ben je er al als je dat toeveoegt aan je query.quote:Op donderdag 5 april 2012 23:07 schreef Swetsenegger het volgende:
Ik heb weer eens een query vraagje.
Ik heb een nested set model en nu wil ik van een bepaald groepjes nodes de parent naam achterhalen
[ code verwijderd ]
Dit werkt bijna Het gaat mis bij nodes die 2 niveaus diep zitten.
aan deze query moet een where worden toegevoegd:
[ code verwijderd ]
is dit uberhaupt mogelijk?
Als je de indexen goed hebt, kun je behoorlijk grote query's nog snel uitvoeren. Meerdere query's maken kan ook, maar dat vereist weer extra logica in PHP en die kost ook tijd.quote:Op donderdag 5 april 2012 23:16 schreef totalvamp het volgende:
[..]
Je kunt hier even kijken (al lijkt je query er al een beetje op)
http://stackoverflow.com/(...)e-children-of-a-node
Eerlijk gezegd zet ik nooit alles in 1 grote query vaak maakt dit dingen alleen maar langzamer dan bijvoorbeeld een paar losse(niet altijd hoor).
Nee, zelfde probleem... als je maar 1 niveau diep bent klopt dat namelijk wel.quote:Op donderdag 5 april 2012 23:25 schreef Light het volgende:
[..]
Is het niet makkelijker om te stellen dat node.id != parent.id ? Volgens mij ben je er al als je dat toeveoegt aan je query.
Hmm... 't klinkt wel als een leuk probleemquote:Op vrijdag 6 april 2012 20:38 schreef Swetsenegger het volgende:
[..]
Nee, zelfde probleem... als je maar 1 niveau diep bent klopt dat namelijk wel.
quote:Op vrijdag 6 april 2012 22:02 schreef Light het volgende:
[..]
Hmm... 't klinkt wel als een leuk probleem
Da's ook een optie natuurlijk. Maar ik wil wel proberen een nettere oplossing te vinden. Moet ik alleen eerst die tabelstructuur voor mezelf helder krijgen.quote:Op vrijdag 6 april 2012 22:05 schreef Swetsenegger het volgende:
[..]Ik heb het maar opgelost door het hoogste niveau een tag te geven en op die tag te filteren.
Niet mooi zeker niet binnen de elegante nested set oplossing, wel effectief.
http://crisp.tweakblogs.n(...)-only-one-query.htmlquote:Op vrijdag 6 april 2012 22:05 schreef Swetsenegger het volgende:
[..]Ik heb het maar opgelost door het hoogste niveau een tag te geven en op die tag te filteren.
Niet mooi zeker niet binnen de elegante nested set oplossing, wel effectief.
Ow maar mijn menu tree opbouwen doe ik ook met 1 query.quote:Op vrijdag 6 april 2012 22:32 schreef GlowMouse het volgende:
[..]
http://crisp.tweakblogs.n(...)-only-one-query.html
| 1 2 3 4 5 6 | SELECT parent.".$menuName." AS parentname, node.menu_id, node.".$menuName." AS name, node.lft, node.rgt, ( COUNT( parent.".$menuName." ) -1) AS depth FROM nested_menu AS node, nested_menu AS parent WHERE node.lft BETWEEN parent.lft AND parent.rgt GROUP BY node.menu_id ORDER BY node.lft |
Ow vast, maar ik heb nu een menu tree waar je zonder problemen items tussen kan voegen, kan deleten, op kan schuiven, etc.quote:Op vrijdag 6 april 2012 22:43 schreef GlowMouse het volgende:
Jouw query is lelijker omdat hij niet via indices gesorteerd kan worden.
| 1 | UPDATE image SET path = UPDATE(path, d:/dir/dir2,g:/dir/dir2); |
quote:Op zaterdag 7 april 2012 11:42 schreef smegmanus het volgende:
Ik wil een path veranderen (voor een applicatie die foto's weg schrijft naar een bepaalde dir) en gebruik het volgende command:
[ code verwijderd ]
Het werkt echter niet, wat doe ik verkeerd?
| 1 2 3 | UPDATE table_name SET column1=value, column2=value2,... WHERE some_column=some_value |
| 1 2 3 | UPDATE image SET path = "d:/dir/dir2" WHERE id=xx |
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | <?php date_default_timezone_set('GMT'); function serverToGMTStamp() { // replaces time return time();//-((date("O") / 100)*60*60);// server timestamp to gmt timestmap } function userInputToGMTStamp($userStamp,$userTimeZone) { // to be saved to database return $userStamp-($userTimeZone*60*60);// user timestamp to gmt timestmap } function gmtToUserTime($gmtStamp,$userTimeZone,$format="d-m-Y H:i") { // displayed date /time in user timezone return date($format,$gmtStamp+($userTimeZone*60*60)); } function inputTimetoStamp($input){ if($input){ list($date, $time) = explode(' ',$input); list($hour, $minute) = explode(':',$time); list($month, $day, $year) = explode('/',$date); $input = mktime ($hour, $minute, 0, $day, $month, $year); return $input; } } $databaseDate = '04/06/2012 20:00'; //date in database already $userTimeZone = 1; //compared to gmt $databaseDateTimestamp = 1333742400; // gmt stamp from database $databaseDateTimestampToUser = $databaseDateTimestamp+($userTimeZone*60*60); // to user timezonestamp $serverToGMTStamp = serverToGMTStamp(); $serverToUserGMTtoUser = $serverToGMTStamp+($userTimeZone*60*60); // to user timezonestamp echo 'databaseDateTimestamp (gmt): '.$databaseDateTimestamp.'<br />'; echo 'databaseDateTimestamp date (gmt): '.date("m/d/Y, H:i",$databaseDateTimestamp).'<br /><br />'; echo 'databaseDateTimestamp (user): '.$databaseDateTimestampToUser.'<br />'; echo 'databaseDateTimestamp date (user): '.date("m/d/Y, H:i",$databaseDateTimestampToUser).'<br /><br />'; echo 'serverTimeStamp (gmt): '.$serverToGMTStamp.'<br />'; echo 'serverTimeStamp date (gmt): '.date("m/d/Y, H:i",$serverToGMTStamp).'<br /><br />'; //echo 'serverTimeStamp (user): '.$serverToUserGMTtoUser.'<br />'; //echo 'serverTimeStamp date (user): '.date("m/d/Y, H:i",$serverToUserGMTtoUser).'<br /><br />'; if($serverToUserGMTtoUser>$databaseDateTimestampToUser) { echo 'input time already past by '.(($serverToUserGMTtoUser-$databaseDateTimestampToUser)/(60*60)); } else{ echo 'input time not past'; } exit(); |
| 1 2 3 4 5 | <?php function serverToGMTStamp() { // replaces time return time(); } ?> |
Voordat je denkt dat je iets fout doet terwijl het niet zo is; momenteel is het voor ons GMT +2 omdat het zomertijd is.quote:Op zaterdag 7 april 2012 18:24 schreef Darkomen het volgende:
Heren,
Ik hoop dat jullie me weer eens kunnen helpen.
Ik ben iets aan het bouwen dat de usertabellen van vbullentin 4 gebruikt.
Hierin staat de usertimezone welke het verschil van hun tijd zone met GMT. bijvoorbeeld voor mijzelf +1
| 1 2 3 4 5 6 7 8 9 10 11 12 | <?php $wallPosts = array(); $wallPosts=file('wallPost.txt', FILE_IGNORE_NEW_LINES); if(!in_array($_SESSION['uid'], $wallPost)) { $onload = "onload=\"postToWall();\""; $fp = fopen('wallPost.txt', 'a'); fwrite($fp, $_SESSION['uid']."\r\n"); fclose($fp); echo $onload; } ?> |
| 1 2 3 4 5 6 7 8 9 10 11 12 13 | <?php $wallPosts = array(); $wallPosts=file('wallPost.txt', FILE_IGNORE_NEW_LINES); print_r($wallPosts); // dit geeft een array terug met de sessieID die HIERONDER geschreven wordt if(!in_array($_SESSION['uid'], $wallPost)) { $onload = "onload=\"postToWall();\""; // wordt niet uitgevoerd $fp = fopen('wallPost.txt', 'a'); //wordt wel uitgevoerd fwrite($fp, $_SESSION['uid']."\r\n"); //wordt wel uitgevoerd fclose($fp); // wordt wel uitgevoerd echo $onload; } ?> |
Nee hij is niet leeg, anders kan hij die ook niet schrijven naar de txt file op regel 8...quote:Op woensdag 11 april 2012 14:50 schreef GlowMouse het volgende:
$_SESSION['uid'] zal wel leeg zijn, maar dat is standaard debugwerk. Regel 2 is overbodig.
string(15) "100003526677056" NULLquote:Op woensdag 11 april 2012 15:01 schreef GlowMouse het volgende:
var_dump($_SESSION['uid'], $wallPost)
Script loopt gewoon door. UID wordt in de txt file geschreven maar geen 'die'quote:Op woensdag 11 april 2012 15:26 schreef GlowMouse het volgende:
wijzig echo $onload; in die($onload), dan kun je hem niet missen
| 1 2 3 4 5 6 7 8 9 10 11 | <?php $wallPosts=file('wallPost.txt', FILE_IGNORE_NEW_LINES); if(!in_array($_SESSION['uid'], $wallPosts)) { $onload = "onload=\"postToWall();\""; $fp = fopen('wallPost.txt', 'a'); fwrite($fp, $_SESSION['uid']."\r\n"); fclose($fp); die($onload); } ?> |
| Forum Opties | |
|---|---|
| Forumhop: | |
| Hop naar: | |