За последние 24 часа нас посетили 17740 программистов и 1619 роботов. Сейчас ищут 1855 программистов ...

помогите с запросом

Тема в разделе "PHP и базы данных", создана пользователем sc2r2bey, 7 май 2010.

  1. sc2r2bey

    sc2r2bey Активный пользователь

    С нами с:
    25 апр 2009
    Сообщения:
    76
    Симпатии:
    0
    хочу сделать запрос из 8 таблиц, не получается
    PHP:
    1. $num = 6;
    2.         $page = $_GET['page'];
    3.         $result = mysql_query("(SELECT
    4.                            photo.id_factory,
    5.                            photo.id AS id_photo,
    6.                            photo.url AS url_photo,
    7.                            factory.id AS id_factory,
    8.                            factory.name AS name_factory,
    9.                            factory.url AS url_factory
    10.  
    11.                            FROM `photo`
    12.  
    13.                            LEFT JOIN `factory`
    14.                            ON photo.id_factory=factory.id
    15.  
    16.                            LEFT JOIN `type`
    17.                            ON photo.id_type=type.id
    18.  
    19.                            LEFT JOIN `style`
    20.                            ON photo.id_style=style.id
    21.  
    22.                            WHERE photo.id_factory='$factory'
    23.                            AND photo.published=1
    24.                            AND type.published=1
    25.                            AND style.published=1
    26.                            AND factory.published=1
    27.  
    28.                            
    29.                            )
    30.  
    31.                            UNION ALL
    32.  
    33.                            (SELECT
    34.                            other_photo.id_factory,
    35.                            other_photo.id AS id_photo,
    36.                            other_photo.url AS url_photo,
    37.                            factory.id AS id_factory,
    38.                            factory.name AS name_factory,
    39.                            factory.url AS url_factory
    40.  
    41.                            FROM `other_photo`
    42.  
    43.                            LEFT JOIN `factory`
    44.                            ON other_photo.id_factory=factory.id
    45.  
    46.                            LEFT JOIN `other`
    47.                            ON other_photo.id_other=other.id
    48.  
    49.                            WHERE other_photo.id_factory='$factory'
    50.                            AND other_photo.published=1
    51.                            AND factory.published=1
    52.                            AND other.published=1
    53.  
    54.                            
    55.                            )");
    56.         $posts = mysql_result($result,0);
    57.         echo $posts;
    58.         $total = intval(($posts - 1) / $num) + 1;
    59.         $page = intval($page);
    60.         if(empty($page) or $page < 0) $page = 1;
    61.         if($page > $total) $page = $total;
    62.         $start = $page * $num - $num;
    63.  
    64.                             $sql = "(SELECT
    65.                            photo.id_factory,
    66.                            photo.id AS id_photo,
    67.                            photo.url AS url_photo,
    68.                            factory.id AS id_factory,
    69.                            factory.name AS name_factory,
    70.                            factory.url AS url_factory
    71.  
    72.                            FROM `photo`
    73.  
    74.                            LEFT JOIN `factory`
    75.                            ON photo.id_factory=factory.id
    76.  
    77.                            LEFT JOIN `type`
    78.                            ON photo.id_type=type.id
    79.  
    80.                            LEFT JOIN `style`
    81.                            ON photo.id_style=style.id
    82.  
    83.                            WHERE photo.id_factory='$factory'
    84.                            AND photo.published=1
    85.                            AND type.published=1
    86.                            AND style.published=1
    87.                            AND factory.published=1
    88.  
    89.                          
    90.  
    91.                            )
    92.  
    93.                            UNION ALL
    94.  
    95.                            (SELECT
    96.                            other_photo.id_factory,
    97.                            other_photo.id AS id_photo,
    98.                            other_photo.url AS url_photo,
    99.                            factory.id AS id_factory,
    100.                            factory.name AS name_factory,
    101.                            factory.url AS url_factory
    102.  
    103.                            FROM `other_photo`
    104.  
    105.                            LEFT JOIN `factory`
    106.                            ON other_photo.id_factory=factory.id
    107.  
    108.                            LEFT JOIN `other`
    109.                            ON other_photo.id_other=other.id
    110.  
    111.                            WHERE other_photo.id_factory='$factory'
    112.                            AND other_photo.published=1
    113.                            AND factory.published=1
    114.                            AND other.published=1
    115.  
    116.                            
    117.  
    118.                            )
    119.  
    120.                            LIMIT $start, $num
    121.                            ";
    122.  
    123.         $photo = mysql_query($sql);
    самое забавное он выдает количество полей равное id_factory, а не реальное существующее в 2-х таблицах соответственно 1-й запрос однозначно не правильно составлен
    :(
    $posts = mysql_result($result,0); выдает значение равное id_factory

    где я ошибся?
     
  2. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    Чего Вы хотите добиться строчкой:
    PHP:
    1.  
    2. <?php
    3. $posts = mysql_result($result,0);
     
  3. sc2r2bey

    sc2r2bey Активный пользователь

    С нами с:
    25 апр 2009
    Сообщения:
    76
    Симпатии:
    0
    посчитать сколько строк выбрано

    я думаю косяк в 1-м запросе, а что именно не могу понять
     
  4. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
     
  5. sc2r2bey

    sc2r2bey Активный пользователь

    С нами с:
    25 апр 2009
    Сообщения:
    76
    Симпатии:
    0
    подправил первый запрос
    [sql]"
    (SELECT COUNT(*)

    FROM `photo`

    LEFT JOIN `factory`
    ON photo.id_factory=factory.id

    LEFT JOIN `type`
    ON photo.id_type=type.id

    LEFT JOIN `style`
    ON photo.id_style=style.id

    WHERE photo.id_factory='$factory'
    AND photo.published=1
    AND type.published=1
    AND style.published=1
    AND factory.published=1)

    UNION ALL

    (SELECT COUNT(*)

    FROM `other_photo`

    LEFT JOIN `factory`
    ON other_photo.id_factory=factory.id

    LEFT JOIN `other`
    ON other_photo.id_other=other.id

    WHERE other_photo.id_factory='$factory'
    AND other_photo.published=1
    AND factory.published=1
    AND other.published=1)
    "[/sql]

    все равно неправильное количество строк выдает
     
  6. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    Больше или меньше ожидаемого?

    И почему Вы думаете что количество строк неверно?

    UPD:Что в теории выбирает Ваш запрос и что в теории возвращает mysql_result?
     
  7. sc2r2bey

    sc2r2bey Активный пользователь

    С нами с:
    25 апр 2009
    Сообщения:
    76
    Симпатии:
    0
    потому что проверял
    он выводит значение строк первой таблицы согласно условию, а надо возвращал сумму строк в обоих талицах согласно условию

    [sql](SELECT COUNT(*)
    FROM `photo`
    LEFT JOIN `factory`
    ON photo.id_factory=factory.id
    LEFT JOIN `type`
    ON photo.id_type=type.id
    LEFT JOIN `style`
    ON photo.id_style=style.id
    WHERE photo.id_factory='$factory'
    AND photo.published=1
    AND type.published=1
    AND style.published=1
    AND factory.published=1)
    UNION ALL
    (SELECT COUNT(*)
    FROM `other_photo`
    LEFT JOIN `factory`
    ON other_photo.id_factory=factory.id
    LEFT JOIN `other`
    ON other_photo.id_other=other.id
    WHERE other_photo.id_factory='$factory'
    AND other_photo.published=1
    AND factory.published=1
    AND other.published=1)[/sql]
     
  8. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    Не-а.
    Он выбирает количество строк, которое вернул первый запрос и количество строк, которое вернул второй запрос.
    А mysql_result($result,0); выбирает первое из этих двух значений.

    На вскидку могу назвать 4 способа это сделать:
    1)Вынести count за за оба запроса. Запросы, соответственно, должны возвращать все строки поиска.
    2)Заменить union на join
    3)Складывать скриптом.
    4)Вернуться к начальному запросу и использовать mysql_num_rows.

    И вообще есть подозрение что в данном случае можно посылать один запрос, а не два похожих, отличных лимитом.
     
  9. sc2r2bey

    sc2r2bey Активный пользователь

    С нами с:
    25 апр 2009
    Сообщения:
    76
    Симпатии:
    0
    а как вынести COUNT?
    может я неправильно UNION использую?

    я вот так сделал
    $posts = mysql_result($result,0)+mysql_result($result,1);
    так можно?
     
  10. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    [sql]select count(*) from(
    select ...
    union all
    select ...
    )
    [/sql]

    Смотря какую цель Вы преследуете используя union.

    Что значит "можно"? Я не проверяющая инстанция. Я не могу определить "можно" или "нельзя".
    Оно работает? Работает как надо? Значит это решение.
    Это решение Вас устраивает? Значит пока его можно использовать.

    Вообще, попробуйте погуглить, может найдете решение, которое Вам больше понравиться. Может увидите недочеты этого решения.
     
  11. sc2r2bey

    sc2r2bey Активный пользователь

    С нами с:
    25 апр 2009
    Сообщения:
    76
    Симпатии:
    0
    спасибо!