Helmet Posted February 19, 2008 Share Posted February 19, 2008 ..at least it's complicated for me I always have trouble with complex queries, but I'm determined to learn something here and not do it in multiple queries. I have a table "messages", with fields threadname, xto and xfrom along with other message details. I also have a table "accounts" with username and thumbname (user photo). I would like to select all the messages in a thread, and get the username and thumbname for the xto and xfrom user id's. How can I write such a query, or is it even possible to do this all in one? This is what I've tried, but it's failing and won't come close to doing what I want anyway: $query = "SELECT messages.*, accounts.username, accounts.thumbname FROM messages, accounts WHERE messages.xfrom = [current user's ID passed into function] AND messages.account = messages.xfrom AND accounts.ID = messages.xfrom AND messages.threadid = [threadid] ORDER BY sent ASC"; I think I have to select every message in the thread and also a username and thumbname for both the sender and retriever. Do I do this by assigning a different name to these in the query somehow? Where I would end up with a result row something like: messageid, threadid, xto, xfrom, xto_username, xto_thumbname, xfrom_username, xfrom_thumbname etc... ? Link to comment https://forums.phpfreaks.com/topic/91808-mysql-complicated-query-brain-in-knots/ Share on other sites More sharing options...
able Posted February 19, 2008 Share Posted February 19, 2008 You need 2 instances of the accounts table, as you have 2 accounts query = "SELECT messages.*, accounts1.username, accounts1.thumbname, accounts2.username, accounts2.thumbname FROM messages, accounts accounts1, accounts accounts2 WHERE messages.xfrom = [current user's ID passed into function] AND messages.account = messages.xfrom AND accounts1.ID = messages.xfrom AND accounts2.ID = messages.xto AND messages.threadid = [threadid] ORDER BY sent ASC"; Just guessing on the query, but something like this. Link to comment https://forums.phpfreaks.com/topic/91808-mysql-complicated-query-brain-in-knots/#findComment-470231 Share on other sites More sharing options...
Helmet Posted February 19, 2008 Author Share Posted February 19, 2008 I just replaced my query with this based on your suggestion, and I know I'm closer, but now I getting a huge list of results even though there is only one message with the passed threadid: $query = "SELECT messages.*, images1.thumbname AS sender_thumbname, accounts1.username AS sender_username, images2.thumbname AS receiver_thumbname, accounts2.username AS receiver_username FROM messages, images images1, images images2, accounts accounts1, accounts accounts2 WHERE messages.threadid = '$id' AND images1.main = 1 AND images2.main = 1 ORDER BY sent ASC"; Unfortunately due to an issue with a BB package I'm integrating, I have the thumbname in two tables, so that's why I'm using the images table now.. Link to comment https://forums.phpfreaks.com/topic/91808-mysql-complicated-query-brain-in-knots/#findComment-470247 Share on other sites More sharing options...
Helmet Posted February 19, 2008 Author Share Posted February 19, 2008 This is a honkin' query, but I seem to have gotten it working. Please let me know if I can shorten this puppy, and thanks for pointing me in the right direction!! $query = "SELECT messages.sent, messages.message, messages.subject, messages.xto, messages.threadid, images1.thumbname AS sender_thumbname, accounts1.username AS sender_username, images2.thumbname AS receiver_thumbname, accounts2.username AS receiver_username FROM messages, images images1, images images2, accounts accounts1, accounts accounts2 WHERE messages.threadid = '$id' AND images1.main = 1 AND images2.main = 1 AND accounts2.ID = messages.xto AND images2.account = messages.xto AND images1.account = messages.xfrom AND accounts1.ID = messages.xfrom ORDER BY sent ASC"; Link to comment https://forums.phpfreaks.com/topic/91808-mysql-complicated-query-brain-in-knots/#findComment-470272 Share on other sites More sharing options...
aschk Posted February 19, 2008 Share Posted February 19, 2008 A shorter version with ANSI joins and table aliases. SELECT m.sent , m.message , m.subject , m.xto , m.threadid ,images1.thumbname AS sender_thumbname ,accounts1.username AS sender_username ,images2.thumbname AS receiver_thumbname ,accounts2.username AS receiver_username FROM messages m JOIN images i1 ON i1.main = 1 JOIN images i2 ON i2.main = 1 JOIN accounts `to` ON `to`.ID = m.xto AND `to`.ID = m.xfrom JOIN accounts `from` ON `from`.ID = m.xfrom WHERE messages.threadid = '$id' ORDER BY sent ASC You might want to test the above and make sure it works as expected. Link to comment https://forums.phpfreaks.com/topic/91808-mysql-complicated-query-brain-in-knots/#findComment-470365 Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.