Go Back   vb.org Archive > vBulletin 3 Discussion > vB3 Programming Discussions
  #1  
Old 06-22-2008, 11:23 AM
Mitch100degrees Mitch100degrees is offline
 
Join Date: Feb 2006
Location: Michigan
Posts: 5
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default MySQL query dilemma

Okay, assume you have a blog where multiple authors can get credit for one entry and you store their userids in a field titled userids separated by commas like this: 1, 368, 9841

Now say you wanted to pull the blog post and their usernames along with it, but the usernames were stored in another table...

You could do this query: SELECT blogstable.*, GROUP_CONCAT(userstable.username ORDER BY FIND_IN_SET(userstable.userid, blogstable.userids) ASC) AS usernames FROM blogs AS blogstable LEFT JOIN users AS userstable ON (FIND_IN_SET(userstable.userid, blogstable.userids)) WHERE blogstable.bid = '1' GROUP BY blogstable.bid

Having bid as your PRIMARY KEY on the blogs table and It works using that index, but with one problem, it does a full table scan of your users table even with a index on your userid field.

Now you could just do this:

$blog = SELECT blogs.* FROM blogs WHERE bid = '1';

then SELECT username FROM users WHERE userid IN ($blog[userids])

and that works using both indexes.

My question to you is, is there anyway to avoid the full table scan that you know of, and if not, how would you personally setup such application to pull the blog and the contributing usernames in 1 query or is that even possible using indexes?
Reply With Quote
  #2  
Old 06-23-2008, 04:18 AM
Eikinskjaldi's Avatar
Eikinskjaldi Eikinskjaldi is offline
 
Join Date: Feb 2006
Location: Hell, never looked better
Posts: 572
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

Quote:
Originally Posted by Mitch100degrees View Post
Okay, assume you have a blog where multiple authors can get credit for one entry and you store their userids in a field titled userids separated by commas like this: 1, 368, 9841
Well I wouldn't have done that for a start.

Set up another table with one line for blog id with a single userid, with multiple rows for multiple users. Either not bother with a primary key or set up a dummy auto-increment field if not having a primary keys gives you the willies (still index both fields)

then you can do

SELECT blogstable.*, group_concat(distinct usertable.username)
FROM blogstable
JOIN blogusers USING (bid)
JOIN usertable on (usertable.userid = blogusers.userid)
WHERE blogstable.bid = 1
GROUP BY blogstable.bid

Quote:
My question to you is, is there anyway to avoid the full table scan that you know of
Not if you are using find_in_set there isn't.
Reply With Quote
Reply

Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT. The time now is 10:40 AM.


Powered by vBulletin® Version 3.8.12 by vBS
Copyright ©2000 - 2024, vBulletin Solutions Inc.
X vBulletin 3.8.12 by vBS Debug Information
  • Page Generation 0.03907 seconds
  • Memory Usage 2,166KB
  • Queries Executed 13 (?)
More Information
Template Usage:
  • (1)SHOWTHREAD
  • (1)ad_footer_end
  • (1)ad_footer_start
  • (1)ad_header_end
  • (1)ad_header_logo
  • (1)ad_navbar_below
  • (1)ad_showthread_beforeqr
  • (1)ad_showthread_firstpost
  • (1)ad_showthread_firstpost_sig
  • (1)ad_showthread_firstpost_start
  • (2)bbcode_quote
  • (1)footer
  • (1)forumjump
  • (1)forumrules
  • (1)gobutton
  • (1)header
  • (1)headinclude
  • (1)navbar
  • (3)navbar_link
  • (120)option
  • (2)post_thanks_box
  • (2)post_thanks_button
  • (1)post_thanks_javascript
  • (1)post_thanks_navbar_search
  • (2)post_thanks_postbit_info
  • (2)postbit
  • (2)postbit_onlinestatus
  • (2)postbit_wrapper
  • (1)spacer_close
  • (1)spacer_open
  • (1)tagbit_wrapper 

Phrase Groups Available:
  • global
  • inlinemod
  • postbit
  • posting
  • reputationlevel
  • showthread
Included Files:
  • ./showthread.php
  • ./global.php
  • ./includes/init.php
  • ./includes/class_core.php
  • ./includes/config.php
  • ./includes/functions.php
  • ./includes/class_hook.php
  • ./includes/modsystem_functions.php
  • ./includes/functions_bigthree.php
  • ./includes/class_postbit.php
  • ./includes/class_bbcode.php
  • ./includes/functions_reputation.php
  • ./includes/functions_post_thanks.php 

Hooks Called:
  • init_startup
  • init_startup_session_setup_start
  • init_startup_session_setup_complete
  • cache_permissions
  • fetch_postinfo_query
  • fetch_postinfo
  • fetch_threadinfo_query
  • fetch_threadinfo
  • fetch_foruminfo
  • style_fetch
  • cache_templates
  • global_start
  • parse_templates
  • global_setup_complete
  • showthread_start
  • showthread_getinfo
  • forumjump
  • showthread_post_start
  • showthread_query_postids
  • showthread_query
  • bbcode_fetch_tags
  • bbcode_create
  • showthread_postbit_create
  • postbit_factory
  • postbit_display_start
  • post_thanks_function_post_thanks_off_start
  • post_thanks_function_post_thanks_off_end
  • post_thanks_function_fetch_thanks_start
  • post_thanks_function_fetch_thanks_end
  • post_thanks_function_thanked_already_start
  • post_thanks_function_thanked_already_end
  • fetch_musername
  • postbit_imicons
  • bbcode_parse_start
  • bbcode_parse_complete_precache
  • bbcode_parse_complete
  • postbit_display_complete
  • post_thanks_function_can_thank_this_post_start
  • tag_fetchbit_complete
  • forumrules
  • navbits
  • navbits_complete
  • showthread_complete