Go Back   vb.org Archive > vBulletin 3 Discussion > vB3 Programming Discussions
FAQ Community Calendar Today's Posts Search

Reply
 
Thread Tools Display Modes
  #1  
Old 03-19-2004, 10:30 PM
Velocd's Avatar
Velocd Velocd is offline
 
Join Date: Mar 2002
Location: CA University
Posts: 1,696
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default Scenario: Optimizing code with LEFT JOIN?

Say I have the following setup:

Code:
| table: athlete |
+--------------------------------+
| id  |  name   |   sports
+--------------------------------+
| 1   |  'John'   |   '1, 2'


| table: sport |
+----------------+
| id  |  title
+----------------+
| 1   |  'soccer'
+----------------+
| 2   |  'track'
PHP Code:
$sql "SELECT name, sports 
    FROM `athlete`"
;

$result mysql_query($sql) or die('Invalid query: ' mysql_error());

while (
$athlete mysql_fetch_array($result))
{
    
$sql "SELECT title 
        FROM `sport` 
        WHERE id IN (
$athlete[sports])";
        
    
$result mysql_query($sql) or die('Invalid query: ' mysql_error());
    
    
$size mysql_num_rows($result);
    
$i 0;
    
    while (
$sport mysql_fetch_array($result))
    {
        
$sports .= $sport['title'] . ($i $size ' & ' '');
        
        
$i++;
    }
    
    echo 
"$athlete[name] enjoys $sports";

Unless I made a mistake, which is possible since I haven't tested the above code, it should print:

Code:
John enjoys soccer & track
My problem is I don't want to call a second query inside the first while loop.

If I had only 1 sport, say soccer, inside the `sports` field for row 1 of table `athlete`, I could do the following:

PHP Code:
$sql "SELECT athlete.name, athlete.sports, sport.title AS sport_list
    FROM `athlete` 
    LEFT JOIN `sport` 
    ON (athlete.sports=sport.id)"
;

$result mysql_query($sql) or die('Invalid query: ' mysql_error());

while (
$athlete mysql_fetch_array($result))
{
    echo 
"$athlete[name] enjoys $athlete[sport_list]";

Returning:

Code:
John enjoys soccer
This only works with one sport though. Is there someway to use a LEFT JOIN and grab the title for all sports whose IDs are located in the athlete's `sports` field?

Maybe return a subarray containing the values?

I understand I could easily insert the names of the sports into the `athlete` table, but in my real code things are much more complicated, and I might have the sport title change, therefore I would have to search every row in the `athletes` table that contains the prior sport name(s) and update it to the new name.

Sorry if my wording is confusing, the actual concept isn't, and hopefully there is a way to simply this process to my needs.

[originally posted at Sitepoint]
Reply With Quote
Reply


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 01:35 PM.


Powered by vBulletin® Version 3.8.12 by vBS
Copyright ©2000 - 2025, vBulletin Solutions Inc.
X vBulletin 3.8.12 by vBS Debug Information
  • Page Generation 0.04326 seconds
  • Memory Usage 2,221KB
  • Queries Executed 11 (?)
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
  • (3)bbcode_code
  • (2)bbcode_php
  • (1)footer
  • (1)forumjump
  • (1)forumrules
  • (1)gobutton
  • (1)header
  • (1)headinclude
  • (1)navbar
  • (3)navbar_link
  • (120)option
  • (1)post_thanks_box
  • (1)post_thanks_button
  • (1)post_thanks_javascript
  • (1)post_thanks_navbar_search
  • (1)post_thanks_postbit_info
  • (1)postbit
  • (1)postbit_onlinestatus
  • (1)postbit_wrapper
  • (1)showthread_list
  • (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_threadedmode.php
  • ./includes/functions_post_thanks.php 

Hooks Called:
  • init_startup
  • init_startup_session_setup_start
  • init_startup_session_setup_complete
  • cache_permissions
  • 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_threaded
  • showthread_threaded_construct_link
  • 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