Выбрать данные из 2-х таблиц [mysql]

Тема в разделе "Базы данных", создана пользователем KillDead, 1 апр 2009.

Статус темы:
Закрыта.
Модераторы: latteo
  1. KillDead

    KillDead

    Регистр.:
    11 авг 2006
    Сообщения:
    883
    Симпатии:
    540
    В общем есть 2 таблицы jos_vm_product_price
    product_id | product_name | avtor |...

    jos_vm_product_price
    product_id | product_price | ...

    Что мне нужно- одним запросом вытащить инфу из 2-х таблиц (название товара+ цену).
    Делаю запрос
    HTML:
    SELECT jos_vm_product_price.product_id,  jos_vm_product.avtor, jos_vm_product.product_name ,jos_vm_product_price.product_price FROM jos_vm_product, jos_vm_product_price WHERE jos_vm_product.product_id = jos_vm_product_price.product_id
    Но не у каджого товара есть цена, те jos_vm_product_price.product_id отсутствует. Помогите составить верный WHERE
     
  2. PHP_Master

    PHP_Master

    Регистр.:
    3 фев 2008
    Сообщения:
    2.647
    Симпатии:
    590
    Так в чём проблема?
    Тебе нужны только записи с ценой?
    Если да, то AND jos_vm_product_price.product_price != '' (или проверка на 0 или NULL, в зависимости от того как построена таблица)
     
  3. AndreyD2

    AndreyD2

    Регистр.:
    21 окт 2008
    Сообщения:
    194
    Симпатии:
    67
    select
    jos_vm_product_price.product_id,
    jos_vm_product.avtor,
    jos_vm_product.product_name ,
    jos_vm_product_price.product_price
    FROM jos_vm_product
    left join jos_vm_product_price On jos_vm_product_price.product_id = jos_vm_product.Id

    where
    jos_vm_product_price is not null //будут только товары с ценой, без where все товары
     
    KillDead нравится это.
  4. KillDead

    KillDead

    Регистр.:
    11 авг 2006
    Сообщения:
    883
    Симпатии:
    540
    Всё, спасибо, разобрался:)
     
  5. KillDead

    KillDead

    Регистр.:
    11 авг 2006
    Сообщения:
    883
    Симпатии:
    540
    опять туплю :). Теперь ситуация такая: Таблица с товарами осталась jos_vm_product
    product_id | product_name | avtor |...

    и есть таблица со статистикой
    jos_vm_stat
    id | id_product | ip |date

    Нужно подсчитать количество строк в jos_vm_stat принадлежащих товару.

    Что-то типо
    Запрос виснет
    :bc:
     
  6. pavel012007

    pavel012007

    Регистр.:
    12 мар 2008
    Сообщения:
    210
    Симпатии:
    117
    Попробуйте так:

    Код:
    SELECT t1.product_id, COUNT(t2.id_product)
    FROM 
    jos_vm_product as t1 LEFT JOIN 
    jos_vm_stat as t2 ON t1.product_id=t2.id_product
    GROUP BY t1.product_id
    
     
  7. KillDead

    KillDead

    Регистр.:
    11 авг 2006
    Сообщения:
    883
    Симпатии:
    540
    решил проблему оптимизацией таблиц:smmne:
     
  8. KillDead

    KillDead

    Регистр.:
    11 авг 2006
    Сообщения:
    883
    Симпатии:
    540
    Непопёрло.:confused: На дреневере скрипт выполняется за 0.5 сек. На говнохосторе - 11сек. Я не очень в mysql, может можно что либо оптимизировать?
    Трабла в том- что у товара должен быть рейтинг. Он формирется в зависимости когда кликнули на товар (текущая неделя- клик считается за 1, клик на прошлой неделе - 0.8 и тп). Если делаю отдельным запросом- всё нормально. Но мне нужно сортировать по рейтингу. Пытаюсь:

    Код:
    select 
    DISTINCT 
    jos_vm_product.product_id, 
    jos_vm_product.avtor, 
    jos_vm_product.product_name ,
    jos_vm_product_price.product_price, 
    jos_vm_product.product_thumb_image
    ,jos_vm_product_price.product_price 
    FROM jos_vm_product
    left join jos_vm_product_price On jos_vm_product_price.product_id = jos_vm_product.product_id
    where jos_vm_product_price.product_price is not null ORDER BY (
    [B](select count(*) from jos_vm_stat WHERE jos_vm_stat.id_product = jos_vm_product.product_id AND jos_vm_stat.refer < '2009-04-01') + [/B]
    [B](select count(*) from jos_vm_stat WHERE jos_vm_stat.id_product = jos_vm_product.product_id AND jos_vm_stat.refer > '2009-04-01' AND jos_vm_stat.refer < '2009-03-25')*0.8 + [/B]
    [B](select count(*) from jos_vm_stat WHERE jos_vm_stat.id_product = jos_vm_product.product_id AND jos_vm_stat.refer > '2009-03-25' AND jos_vm_stat.refer < '2009-03-18')*0.6 + [/B]
    [B](select count(*) from jos_vm_stat WHERE jos_vm_stat.id_product = jos_vm_product.product_id AND jos_vm_stat.refer > '2009-03-08' AND jos_vm_stat.refer < '2009-02-17')*0.2 + [/B]
    [B](select count(*) from jos_vm_stat WHERE jos_vm_stat.id_product = jos_vm_product.product_id AND jos_vm_stat.refer < '2009-02-16')*0.2[/B]
    ) DESC LIMIT 10
     
     
    

    explain вернул следующее :
    [​IMG]
     
  9. Виллен

    Виллен

    Регистр.:
    12 мар 2009
    Сообщения:
    236
    Симпатии:
    60
    А зачем тебе каждый запрос производить расчет рейтинга?
    Cделай кеширование, т.е. в таблицу товара добавь поле рейтинг, в котором будет храниться указанная сумма, и пересчитывай ее раз в сутки.
    А уж сортировка по этому полю будет происходить быстро
     
  10. MadWizard

    MadWizard Постоялец

    Регистр.:
    24 мар 2009
    Сообщения:
    145
    Симпатии:
    20
    Согласен с Вилленом. Кроме того, что этот запрос должен во время каждого клика вычислять рейтинг на лету, так еще и даты интервалов должны корректно изменяться со временем. Вполне разумный вариант с добавлением поля рейтинг в таблицу товаров и пересчета этого поля по расписанию, хоть раз в час.
     
Статус темы:
Закрыта.