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
  #2  
Old 03-20-2004, 09:43 AM
Dean C's Avatar
Dean C Dean C is offline
 
Join Date: Jan 2002
Location: England
Posts: 9,071
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

Why not have both queries and loop through them and create an array. Then work with it from there..?
Reply With Quote
  #3  
Old 03-20-2004, 04:54 PM
Velocd's Avatar
Velocd Velocd is offline
 
Join Date: Mar 2002
Location: CA University
Posts: 1,696
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

Well, that's what I'm doing in the first example. I'm just wondering if there is a way to do it in 1 query. :[]
Reply With Quote
  #4  
Old 03-20-2004, 05:04 PM
Dean C's Avatar
Dean C Dean C is offline
 
Join Date: Jan 2002
Location: England
Posts: 9,071
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

You're doing a query loop there. For every row you're running two queries. What I meant was to run both queries. Loop through them both and place their contents in two arrays. That way you have two queries?
Reply With Quote
  #5  
Old 03-20-2004, 06:19 PM
Boofo's Avatar
Boofo Boofo is offline
 
Join Date: Mar 2002
Location: Des Moines, IA (USA)
Posts: 15,776
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

Why don't you use just one table instead of having 2 tables? That way you could pull all the info with 1 query.
Reply With Quote
  #6  
Old 03-21-2004, 11:47 PM
Velocd's Avatar
Velocd Velocd is offline
 
Join Date: Mar 2002
Location: CA University
Posts: 1,696
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

In my real code, the tables are much more complex and so is how the data is handled. One table wouldn't work at all.

As for creating two arrays from two loops, that would lead me to having arrays with arrays with arrays in them, and all sorts of messy goodness.

A suggestion by a member of Sitepoint (http://www.sitepoint.com/forums/show....php?p=1149531) was to create a 3rd table for containing the relations, and then using 1 query to access all the required data through an inner join.
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 08:01 AM.


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.03970 seconds
  • Memory Usage 2,230KB
  • 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
  • (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
  • (6)post_thanks_box
  • (6)post_thanks_button
  • (1)post_thanks_javascript
  • (1)post_thanks_navbar_search
  • (6)post_thanks_postbit_info
  • (6)postbit
  • (6)postbit_onlinestatus
  • (6)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_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