1. Advertising
    y u no do it?

    Advertising (learn more)

    Advertise virtually anything here, with CPM banner ads, CPM email ads and CPC contextual links. You can target relevant areas of the site and show ads based on geographical location of the user if you wish.

    Starts at just $1 per CPM or $0.10 per CPC.

4 table query, getting dupe rows and confused!

Discussion in 'MySQL' started by meloncreative, Jan 1, 2011.

  1. #1
    So I have written a query that will grab an order (this is for an ecommerce type site), and from that order id it will get all order items (ecom_order_items), print options (c_print_options) and images (images). The eoi_p_id is currently a foreign key from the images table.

    This works fine and the query is:

    SELECT
    eoi_parentid, eoi_p_id, eoi_po_id, eoi_quantity,
    i_id, i_parentid,
    po_name, po_price
    FROM ecom_order_items, images, c_print_options WHERE eoi_parentid = '1' AND i_id = eoi_p_id AND po_id = eoi_po_id;
    Code (markup):
    The above would grab all the stuff I need for order #1

    Now to complicate things I added an extra table (ecom_products), which needs to act in a similar way to the images table. The eoi_p_id can also point at a foreign key in this table too. I have added an extra field 'eoi_type' which will either have the value 'image', or 'product'.

    Now items in the order could be made up of a mix of items from images or ecom_products. Whatever I try it either ends up with too many records, wont actually output any with eoi_type = 'product', and just generally wont work. Any ideas on how to achieve what I am after? Can provide SQL samples if needed?

    
    SELECT
    eoi_id, eoi_parentid, eoi_p_id, eoi_po_id, eoi_po_id_2, eoi_quantity, eoi_type,
    i_id, i_parentid,
    po_name, po_price, po_id,
    ep_id
    FROM ecom_order_items, images, c_print_options, ecom_products WHERE eoi_parentid = '9' AND i_id = eoi_p_id AND po_id = eoi_po_id
    Code (markup):
    The above outputs duplicate rows and doesnt work as expected. Am I going about this the wrong way? Should I have seperate foreign key fields for the eoi_p_id depending it its an image or a product?

    Should I be using JOINs?

    Here is a mysql explain of the tables in question

    ecom_products
    
    +-------------+--------------+------+-----+---------+----------------+
    | Field       | Type         | Null | Key | Default | Extra          |
    +-------------+--------------+------+-----+---------+----------------+
    | ep_id       | int(8)       | NO   | PRI | NULL    | auto_increment |
    | ep_title    | varchar(255) | NO   |     | NULL    |                |
    | ep_link     | text         | NO   |     | NULL    |                |
    | ep_desc     | text         | NO   |     | NULL    |                |
    | ep_imgdrop  | text         | NO   |     | NULL    |                |
    | ep_price    | decimal(6,2) | NO   |     | NULL    |                |
    | ep_category | varchar(255) | NO   |     | NULL    |                |
    | ep_hide     | tinyint(1)   | NO   |     | 0       |                |
    | ep_featured | tinyint(1)   | NO   |     | 0       |                |
    +-------------+--------------+------+-----+---------+----------------+
    
    ecom_order_items
    
    +--------------+-------------+------+-----+---------+----------------+
    | Field        | Type        | Null | Key | Default | Extra          |
    +--------------+-------------+------+-----+---------+----------------+
    | eoi_id       | int(8)      | NO   | PRI | NULL    | auto_increment |
    | eoi_parentid | int(8)      | NO   |     | NULL    |                |
    | eoi_type     | varchar(32) | NO   |     | NULL    |                |
    | eoi_p_id     | int(8)      | NO   |     | NULL    |                |
    | eoi_po_id    | int(8)      | NO   |     | NULL    |                |
    | eoi_quantity | int(4)      | NO   |     | NULL    |                |
    +--------------+-------------+------+-----+---------+----------------+
    
    c_print_options
    
    +------------+--------------+------+-----+---------+----------------+
    | Field      | Type         | Null | Key | Default | Extra          |
    +------------+--------------+------+-----+---------+----------------+
    | po_id      | int(8)       | NO   | PRI | NULL    | auto_increment |
    | po_name    | varchar(255) | NO   |     | NULL    |                |
    | po_price   | decimal(6,2) | NO   |     | NULL    |                |
    +------------+--------------+------+-----+---------+----------------+
    
    images
    
    +--------------+--------------+------+-----+---------+----------------+
    | Field        | Type         | Null | Key | Default | Extra          |
    +--------------+--------------+------+-----+---------+----------------+
    | i_id         | int(8)       | NO   | PRI | NULL    | auto_increment |
    | i_filename   | varchar(255) | NO   |     | NULL    |                |
    | i_data       | longtext     | NO   |     | NULL    |                |
    | i_parentid   | int(8)       | NO   |     | NULL    |                |
    +--------------+--------------+------+-----+---------+----------------+
    
    Code (markup):

     
    Last edited: Jan 1, 2011
    meloncreative, Jan 1, 2011 IP
  2. meloncreative

    meloncreative Peon

    Messages:
    37
    Likes Received:
    0
    Best Answers:
    0
    Trophy Points:
    0
    #2
    Nevermind, solved it using a mix of LEFT JOIN, INNER JOIN, and UNION
     
    meloncreative, Jan 1, 2011 IP