PHP MYSQL для запроса нескольких таблиц, где вторая таблица возвращает несколько строк - PullRequest
1 голос
/ 20 августа 2011

Я пытаюсь запросить 2 таблицы, где первая таблица вернет 1 строку, а вторая - несколько строк.Таким образом, в основном первая таблица с текстом возврата на странице и вторая таблица будут возвращать список, который будет находиться на странице.Обе таблицы имеют справочную строку, к которой обращаются обе таблицы.(См. Ниже)

SELECT shop_rigs.*, shop_rigs_images.*, shop_rigs_parts.*
    FROM shop_rigs
    LEFT JOIN shop_rigs_images 
        ON shop_rigs.shoprigs_ref = shop_rigs_images.shoprigsimg_ref 
    LEFT JOIN shop_rigs_parts
        ON shop_rigs.shoprigs_ref = shop_rigs_parts.shoprigsparts_ref 
    WHERE shoprigs_enabled='1' AND shoprigs_ref='$rig_select'
    ORDER BY shoprigs_order ASC

Лучше всего сделать 2 запроса?

Спасибо,

  • датчанин

Ответы [ 3 ]

1 голос
/ 20 августа 2011

Я бы сделал это в двух запросах.Проблема не в эффективности или размере соответствующих таблиц, а в том, что вы создаете декартово произведение между shop_rigs_images и shop_rigs_parts.

Это означает, что если в данной строке shop_rigs есть три изображения и четыре части, вы получите 3х4 = 12 строк для этого одиночного shop_rig.

Итак, вот как я бы это написал:

SELECT ...
FROM shop_rigs
INNER JOIN shop_rigs_images 
    ON shop_rigs.shoprigs_ref = shop_rigs_images.shoprigsimg_ref 
WHERE shoprigs_enabled='1' AND shoprigs_ref='$rig_select'
ORDER BY shoprigs_order ASC

SELECT ...
FROM shop_rigs
INNER JOIN shop_rigs_parts
    ON shop_rigs.shoprigs_ref = shop_rigs_parts.shoprigsparts_ref 
WHERE shoprigs_enabled='1' AND shoprigs_ref='$rig_select'
ORDER BY shoprigs_order ASC

Я исключил список выбора столбцов, потому что я согласен с @Doug Kress, что вы должны выбирать только те столбцы, которые вам нужны в данном запросе, а не все столбцы с *.

0 голосов
/ 20 августа 2011

Объединения обычно более эффективны, чем выполнение 2 запросов, если вы объединяетесь по индексам, но тогда это зависит от ваших данных и индексов. Возможно, вы захотите запустить «объяснение SELECT .....» для обеих опций и сравнить «возможные ключи» и «строки» из ваших результатов.

0 голосов
/ 20 августа 2011

Если вы извлекаете большой объем данных из первой таблицы, то было бы лучше сделать два запроса.

Кроме того, для эффективности было бы лучше указать каждый столбец, который вам действительно нужен, а не все столбцы - таким образом будет извлекаться и извлекаться меньше данных.

...