Prev: curl
Next: Question about the Board
From: Jason Pruim on 5 Jul 2010 09:02 Hi everyone, I'll admit right now that I'm still trying to wrestle with inner joins... Which leaves me with this code right here: <?PHP if(isset($_GET['cat'])) { $cat = mysql_real_escape_string($_GET['cat']); } if(isset($cat)) { $sql = "SELECT * FROM ".$cfgtableContent." INNER JOIN ".$cfgtableCategories." WHERE ".$cfgtableContent.".postCat = ".$cat." ORDER BY ".$cfgtableContent.".postNumber DESC"; } ?> Now... I know the problem is probably staring an experienced inner join master in the face and I don't even have to say it... But for those who don't know or you might be searching the archives and want to learn from my blatant misunderstanding of inner joins I'll outline said problem in the following lines. What I want to achieve: Add navigation by category to my blog. IE: If I want to display just Personal posts click on the "Personal" link and all other posts magically disappear. What I'm getting now: I have 5 categories in my blog now... I get 5 copies of each post repeated down the site all with a different category... All the variables are filled in correctly which I have checked with simple echo's. I have also tried removing the escaping of the data with no change so if possible I'd like to leave it in there as is :) I have also tried switching it from the above to this: <?PHP $sql = "SELECT * FROM ".$cfgtableContent." INNER JOIN ".$cfgtableContent." WHERE ".$cfgtableCategories.".postCat = ".$cat." ORDER BY ".$cfgtableContent.".postNumber DESC"; ?> with no change... Any ideas what I'm missing? :)
From: Peter Lind on 5 Jul 2010 09:14 On 5 July 2010 15:02, Jason Pruim <lists(a)pruimphotography.com> wrote: > Hi everyone, > > I'll admit right now that I'm still trying to wrestle with inner joins... > Which leaves me with this code right here: > > <?PHP > > if(isset($_GET['cat'])) { > Â Â Â Â Â Â $cat = mysql_real_escape_string($_GET['cat']); > > Â Â Â Â } > > Â Â Â Â if(isset($cat)) { > Â Â Â Â Â Â Â $sql = "SELECT * FROM ".$cfgtableContent." INNER JOIN > ".$cfgtableCategories." WHERE ".$cfgtableContent.".postCat = ".$cat." ORDER > BY ".$cfgtableContent.".postNumber DESC"; > > Â Â Â Â } > > ?> > > Now... I know the problem is probably staring an experienced inner join > master in the face and I don't even have to say it... But for those who > don't know or you might be searching the archives and want to learn from my > blatant misunderstanding of inner joins I'll outline said problem in the > following lines. > > What I want to achieve: Add navigation by category to my blog. IE: If I want > to display just Personal posts click on the "Personal" link and all other > posts magically disappear. > > What I'm getting now: I have 5 categories in my blog now... I get 5 copies > of each post repeated down the site all with a different category... > > All the variables are filled in correctly which I have checked with simple > echo's. I have also tried removing the escaping of the data with no change > so if possible I'd like to leave it in there as is :) > > I have also tried switching it from the above to this: > > <?PHP > > Â Â Â Â Â Â Â $sql = "SELECT * FROM ".$cfgtableContent." INNER JOIN > ".$cfgtableContent." WHERE ".$cfgtableCategories.".postCat = ".$cat." ORDER > BY ".$cfgtableContent.".postNumber DESC"; > > ?> > > with no change... > There's no join clause in your query, i.e. nothing to tie the two tables together. That will leave you with a cartesian product, i.e. for every row in table a you'll get the entire table b joined on. You need to specify how the tables you're joining together are related. Something like SELECT a.row FROM a JOIN b ON b.a_id = a.id Regards Peter -- <hype> WWW: http://plphp.dk / http://plind.dk LinkedIn: http://www.linkedin.com/in/plind BeWelcome/Couchsurfing: Fake51 Twitter: http://twitter.com/kafe15 </hype>
From: Richard Quadling on 5 Jul 2010 09:38 On 5 July 2010 14:02, Jason Pruim <lists(a)pruimphotography.com> wrote: > Hi everyone, > > I'll admit right now that I'm still trying to wrestle with inner joins... It is all about set theory. Imagine two circles, which overlap (http://en.wikipedia.org/wiki/Venn_diagram#Example as an example). For that example, simplistically, A contains me and my emu. B contains my emu and the my deathwatch beetle. SELECT * FROM A,B WHERE A.id = B.id (My emu) SELECT * FROM A INNER JOIN B ON A.id = B.id (My emu) SELECT * FROM A LEFT OUTER JOIN B ON A.id = B.id (Me and My emu) SELECT * FROM A RIGHT OUTER JOIN B ON A.id = B.id (My emu and my deathwatch beetle) SELECT * FROM A FULL OUTER JOIN B ON A.id = B.id returns in interesting set (essentially all things but 1 column for each table). Me, null My emu, my emu null, My deathwatch beetle. If you were using ISNULL ... SELECT ISNULL(A.name, B.name) AS name FROM A FULL OUTER JOIN B ON A.id = B.id would return all things Me My emu My deathwatch beetle. And, (I think), finally, an inversion of the inner join. SELECT ISNULL(A.name, B.name) AS name FROM A FULL OUTER JOIN B ON A.id = B.id WHERE A.id IS NULL OR B.id IS NULL returns Me My deathwatch beetle. All things except those 2 legged things that can fly. I hope that helps. Regards, Richard. P.S. I don't have an emu.
From: Pete Ford on 5 Jul 2010 09:48 On 05/07/10 14:38, Richard Quadling wrote: > On 5 July 2010 14:02, Jason Pruim<lists(a)pruimphotography.com> wrote: >> Hi everyone, >> >> I'll admit right now that I'm still trying to wrestle with inner joins... > > It is all about set theory. Imagine two circles, which overlap > (http://en.wikipedia.org/wiki/Venn_diagram#Example as an example). > > For that example, simplistically, A contains me and my emu. B contains > my emu and the my deathwatch beetle. > > > SELECT * FROM A,B WHERE A.id = B.id (My emu) > > SELECT * FROM A INNER JOIN B ON A.id = B.id (My emu) > > SELECT * FROM A LEFT OUTER JOIN B ON A.id = B.id (Me and My emu) > > SELECT * FROM A RIGHT OUTER JOIN B ON A.id = B.id (My emu and my > deathwatch beetle) > > SELECT * FROM A FULL OUTER JOIN B ON A.id = B.id > > returns in interesting set (essentially all things but 1 column for each table). > > Me, null > My emu, my emu > null, My deathwatch beetle. > > If you were using ISNULL ... > > SELECT ISNULL(A.name, B.name) AS name FROM A FULL OUTER JOIN B ON A.id = B.id > > would return all things > > Me > My emu > My deathwatch beetle. > > > And, (I think), finally, an inversion of the inner join. > > > SELECT ISNULL(A.name, B.name) AS name FROM A FULL OUTER JOIN B ON A.id > = B.id WHERE A.id IS NULL OR B.id IS NULL > > returns > > Me > My deathwatch beetle. > > All things except those 2 legged things that can fly. > > I hope that helps. > > Regards, > > Richard. > > P.S. I don't have an emu. Clearly, or you'd know that they can't fly either... :) -- Peter Ford, Developer phone: 01580 893333 fax: 01580 893399 Justcroft International Ltd. www.justcroft.com Justcroft House, High Street, Staplehurst, Kent TN12 0AH United Kingdom Registered in England and Wales: 2297906 Registered office: Stag Gates House, 63/64 The Avenue, Southampton SO17 1XS
From: Richard Quadling on 5 Jul 2010 10:44
On 5 July 2010 14:48, Pete Ford <pete(a)justcroft.com> wrote: >> P.S. I don't have an emu. > > Clearly, or you'd know that they can't fly either... > :) GIGO!!! |