подкаректировать запросец в mysql

Тема в разделе "Базы данных", создана пользователем ghostik32, 26 апр 2010.

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

    ghostik32 Создатель

    Регистр.:
    26 янв 2010
    Сообщения:
    40
    Симпатии:
    1
    есть запрос:
    PHP:
    mysql_query ("SELECT * FROM `products` WHERE mesto_proizvodstva = '$city' AND (name LIKE '%{$search_text}%' OR keyword LIKE '%{$search_text}%' OR discription LIKE '%{$search_text}%') ORDER BY view DESC");
    он ищет совпадения слов в 3 полях и сортирует по количеству просмотров (view), нужно както добавить чтобы он смотрел в ещё одну таблицу (users) доставал из неё столбец (premium) и если в ней "1" то независимо от кол-ва просмотров (view) выводил на первое место (если у нескольких юзеров есть premium то сортируется по "view"). Вот както так =)
     
  2. Shmaltorhbooks

    Shmaltorhbooks Создатель

    Регистр.:
    24 июн 2007
    Сообщения:
    23
    Симпатии:
    2
    если у тебя таблички связаны через поле id (что вряд ли), то запрос будет приблизительно таким
    PHP:
    SELECT 
        
    `products`.`mesto_proizvodstva`, 
        `
    products`.`name`, 
        `
    products`.`keyword`,
        `
    products`.`discription`
    FROM 
        
    `products`,
        `
    users
    WHERE     (
        (
        `
    products`.`mesto_proizvodstva` = '$city' 
        
    AND 
            (`
    products`.`nameLIKE '%{$search_text}%' 
        
    OR 
            `
    products`.`keywordLIKE '%{$search_text}%' 
        
    OR
            `
    products`.`discriptionLIKE '%{$search_text}%')
        )
    OR 
        `
    users`.`premium` = 1
    AND
        `
    users`.`id` = `products`.`id`
    )
    ORDER BY
        
    `users`.`premiumDESC, `viewDESC
    обрати внимание, что в самом последнем условии
    PHP:
    AND `users`.`id` = `products`.`id`
    надо заменить оба id на те поля из таблиц, которыми они связаны.
    названия таблиц перед всеми полями проставил, т.к. неясно какие поля могут иметь одинаковые названия в обоих таблицах.
    если не будет работать - выкладывай структуру таблиц
     
  3. rex1963

    rex1963

    Регистр.:
    19 фев 2007
    Сообщения:
    228
    Симпатии:
    47
    Лучше наверное так
    PHP:
    SELECT 
        
    `products`.`mesto_proizvodstva`, 
        `
    products`.`name`, 
        `
    products`.`keyword`,
        `
    products`.`discription`
    FROM 
        
    `products`
    INNER JOIN `users
    WHERE     (
        (
        `
    products`.`mesto_proizvodstva` = '$city' 
        
    AND 
            (`
    products`.`nameLIKE '%{$search_text}%' 
        
    OR 
            `
    products`.`keywordLIKE '%{$search_text}%' 
        
    OR
            `
    products`.`discriptionLIKE '%{$search_text}%')
        )
    OR 
        `
    users`.`premium` = 1
    AND
        `
    users`.`id` = `products`.`id`
    )
    ORDER BY
        
    `users`.`premiumDESC, `viewDESC  
    Заменить `products`,`users` на INNER JOIN `users`
     
  4. ghostik32

    ghostik32 Создатель

    Регистр.:
    26 янв 2010
    Сообщения:
    40
    Симпатии:
    1
    попробовал но почемуто не получилось, выводит в беспорядочном виде их както.
    Может я что-то не так обьяснил.
    Вот дамп таблиц:
    PHP:
    CREATE TABLE `users` (
      `
    idint(7NOT NULL auto_increment,
      `
    firstNamevarchar(20) default NULL,
      `
    lastNamevarchar(20) default NULL,
      `
    patronymicvarchar(20) default NULL,
      `
    sexvarchar(6) default NULL,
      `
    logovarchar(128) default NULL,
      `
    companyIDint(6NOT NULL default '0',
      `
    telefonevarchar(30) default NULL,
      `
    faxvarchar(50) default NULL,
      `
    mobilevarchar(30) default NULL,
      `
    countryint(3) default NULL,
      `
    typeAccountvarchar(10) default NULL,
      `
    emailvarchar(128) default NULL,
      `
    altEmailvarchar(128) default NULL,
      `
    passwordvarchar(60) default NULL,
      `
    jobTitlevarchar(32) default NULL,
      `
    goldMemberint(1) default NULL,
      `
    streetvarchar(250) default NULL,
      `
    cityvarchar(80) default NULL,
      `
    oblastvarchar(128) default NULL,
      `
    zipCodevarchar(12) default NULL,
      `
    secret_questionvarchar(40) default NULL,
      `
    secret_answervarchar(30) default NULL,
      `
    banint(1) default NULL,
      `
    creditsint(15) default NULL,
      `
    hashvarchar(90) default NULL,
      `
    link_forgottext,
      `
    premiumint(1) default NULL,
      `
    premium_endvarchar(20) default NULL,
      `
    joinedint(15) default NULL,
      `
    ipvarchar(20) default NULL,
      `
    brausertext,
      `
    onlineint(1) default NULL,
      `
    last_timeint(12) default NULL,
      `
    last_ipvarchar(20) default NULL,
      
    PRIMARY KEY  (`id`)
    ENGINE=MyISAM AUTO_INCREMENT=DEFAULT CHARSET=cp1251;
    PHP:
    CREATE TABLE `products` (
      `
    idint(20NOT NULL auto_increment,
      `
    ownerIdint(10NOT NULL,
      `
    namevarchar(128) default NULL,
      `
    keywordvarchar(50) default NULL,
      `
    subCategoriesint(6) default NULL,
      `
    mesto_proizvodstvaint(6) default NULL,
      `
    region_gorodvarchar(56) default NULL,
      `
    discriptiontext,
      `
    min_zakazvarchar(20) default NULL,
      `
    min_zakaz_izmerenievarchar(50) default NULL,
      `
    min_zakaz_othervarchar(50) default NULL,
      `
    cena_tip_platezavarchar(40) default NULL,
      `
    cena_minvarchar(20) default NULL,
      `
    cena_maxvarchar(30) default NULL,
      `
    cena_tip_izmereniyavarchar(50) default NULL,
      `
    uslovie_dostavkivarchar(128) default NULL,
      `
    srok_postavkivarchar(128) default NULL,
      `
    uslovie_oplatyvarchar(250) default NULL,
      `
    uslovie_oplaty_othervarchar(128) default NULL,
      `
    moshnostivarchar(128) default NULL,
      `
    moshnosti_tip_izmereniyavarchar(50) default NULL,
      `
    moshnosti_timevarchar(10) default NULL,
      `
    moshnosti_othervarchar(128) default NULL,
      `
    upakovkavarchar(510) default NULL,
      `
    logovarchar(128) default NULL,
      `
    kogda_dobavlenint(12) default NULL,
      `
    viewint(10) default NULL,
      
    PRIMARY KEY  (`id`)
    ENGINE=MyISAM AUTO_INCREMENT=52 DEFAULT CHARSET=cp1251;
    Суть такая: В поля поиска юзеры вводят что хотят найти, запрос должен пробежаться по полям "name,keyword,discription" в таблице "products" и глянуть в поле "premium" таблицы "users", если поле премимум "1" то эти товары выводить на первые места, а если несколько юзеров имеют "premium" = 1 то уже сортировать по "products" "view". Те юзеры у которыч "premium" = 0 то их выводить после тех у кого "premium" = 1, и сортировать их по "view".
    Знаю запросец не простой но кто поможет отблагодарю материально!

    Добавлено через 2 минуты
    нехочет так искать
     
  5. MadWizard

    MadWizard Постоялец

    Регистр.:
    24 мар 2009
    Сообщения:
    145
    Симпатии:
    20
    Код:
    [COLOR=#000000][FONT=Courier New][COLOR=#0000bb]SELECT  
        [/COLOR][COLOR=#007700]`[/COLOR][COLOR=#0000bb]products[/COLOR][COLOR=#007700]`.`[/COLOR][COLOR=#0000bb]mesto_proizvodstva[/COLOR][/FONT][FONT=Courier New][COLOR=#007700]`,  
        `[/COLOR][COLOR=#0000bb]products[/COLOR][COLOR=#007700]`.`[/COLOR][COLOR=#0000bb]name[/COLOR][/FONT][FONT=Courier New][COLOR=#007700]`,  
        `[/COLOR][COLOR=#0000bb]products[/COLOR][COLOR=#007700]`.`[/COLOR][COLOR=#0000bb]keyword[/COLOR][/FONT][FONT=Courier New][COLOR=#007700]`, 
        `[/COLOR][COLOR=#0000bb]products[/COLOR][COLOR=#007700]`.`[/COLOR][COLOR=#0000bb]discription[/COLOR][/FONT][COLOR=#007700][FONT=Courier New]` 
    [/FONT][/COLOR][FONT=Courier New][COLOR=#0000bb]FROM  
        [/COLOR][COLOR=#007700]`[/COLOR][COLOR=#0000bb]products[/COLOR][/FONT][FONT=Courier New][COLOR=#007700]` 
    [/COLOR][COLOR=#0000bb]INNER JOIN [/COLOR][COLOR=#007700]`[/COLOR][COLOR=#0000bb]users[/COLOR][/FONT][FONT=Courier New][COLOR=#007700]` ON `[COLOR=#0000bb]users[/COLOR][COLOR=#007700]`.`[/COLOR][COLOR=#0000bb]id[/COLOR][COLOR=#007700]` = `[/COLOR][COLOR=#0000bb]products[/COLOR][COLOR=#007700]`.`[/COLOR][COLOR=#0000bb]id[/COLOR][COLOR=#007700][FONT=Courier New]`[/FONT][/COLOR]  
    [/COLOR][COLOR=#0000bb]WHERE     [/COLOR][/FONT][FONT=Courier New][COLOR=#007700]
        `[/COLOR][COLOR=#0000bb]products[/COLOR][COLOR=#007700]`.`[/COLOR][COLOR=#0000bb]mesto_proizvodstva[/COLOR][COLOR=#007700]` = [/COLOR][/FONT][COLOR=#dd0000][FONT=Courier New]'$city'  
        [/FONT][/COLOR][FONT=Courier New][COLOR=#007700]AND  
            (`[/COLOR][COLOR=#0000bb]products[/COLOR][COLOR=#007700]`.`[/COLOR][COLOR=#0000bb]name[/COLOR][COLOR=#007700]` [/COLOR][COLOR=#0000bb]LIKE [/COLOR][/FONT][COLOR=#dd0000][FONT=Courier New]'%{$search_text}%'  
        [/FONT][/COLOR][FONT=Courier New][COLOR=#007700]OR  
            `[/COLOR][COLOR=#0000bb]products[/COLOR][COLOR=#007700]`.`[/COLOR][COLOR=#0000bb]keyword[/COLOR][COLOR=#007700]` [/COLOR][COLOR=#0000bb]LIKE [/COLOR][/FONT][COLOR=#dd0000][FONT=Courier New]'%{$search_text}%'  
        [/FONT][/COLOR][FONT=Courier New][COLOR=#007700]OR 
            `[/COLOR][COLOR=#0000bb]products[/COLOR][COLOR=#007700]`.`[/COLOR][COLOR=#0000bb]discription[/COLOR][COLOR=#007700]` [/COLOR][COLOR=#0000bb]LIKE [/COLOR][COLOR=#dd0000]'%{$search_text}%'[/COLOR][/FONT][FONT=Courier New][COLOR=#007700] 
             ) 
    [/COLOR][/FONT][FONT=Courier New][COLOR=#0000bb]ORDER BY 
        [/COLOR][COLOR=#007700]`[/COLOR][COLOR=#0000bb]users[/COLOR][COLOR=#007700]`.`[/COLOR][COLOR=#0000bb]premium[/COLOR][COLOR=#007700]` [/COLOR][COLOR=#0000bb]DESC[/COLOR][COLOR=#007700], `[/COLOR][COLOR=#0000bb]view[/COLOR][COLOR=#007700]` [/COLOR][/FONT][COLOR=#0000bb][FONT=Courier New]DESC  [/FONT]
    [/COLOR][/COLOR]
     
  6. Shmaltorhbooks

    Shmaltorhbooks Создатель

    Регистр.:
    24 июн 2007
    Сообщения:
    23
    Симпатии:
    2
    я, после того, как недавно узрел, что запрос с несложным джойном выполняется в 4 раза дольше, чем по сути своей такой же запрос, состоящий из одного запроса по двум табличкам + вложенный запрос перестал интересоваться джойнами и на данный момент в них я полный ноль. хотя, не спорю - возможно, это просто глюк какой-то конкретной базы, индексов, таблиц или просто хитрое сплетение полей, но факт остается фактом - джойны я не люблю, посему продолжить тему не могу:)
     
  7. rex1963

    rex1963

    Регистр.:
    19 фев 2007
    Сообщения:
    228
    Симпатии:
    47
    JOIN может иметь условие ON
    а CROSS JOIN ( или запятая) - не может.
     
  8. MadWizard

    MadWizard Постоялец

    Регистр.:
    24 мар 2009
    Сообщения:
    145
    Симпатии:
    20
    Join по сути своей и представляет 2 запроса к таблицам и связыванение выборки по условию. Поэтому если он выполняется в 4 раза дольше, то дело скорее всего в индексах.
     
  9. ghostik32

    ghostik32 Создатель

    Регистр.:
    26 янв 2010
    Сообщения:
    40
    Симпатии:
    1
    Немного подкорректировал запросец и вот что получилось:
    PHP:
    $_SQL "SELECT
                 products.id,
                 products.ownerId,
                 products.name,
                 products.keyword,
                 products.discription,
                 products.min_zakaz,
                 products.min_zakaz_izmerenie,
                 products.min_zakaz_other,
                 products.mesto_proizvodstva,
                 products.cena_tip_plateza,
                 products.cena_min,
                 products.cena_max,
                 products.cena_tip_izmereniya,
                 products.logo
             FROM
                 `products`,
                 `users`
             WHERE
               checked = '1'
             AND
               users.id = products.ownerId
             AND
             (
               products.name LIKE '%
    {$search_text}%' OR 
               products.keyword LIKE '%
    {$search_text}%' OR 
               products.discription LIKE '%
    {$search_text}%'
             )
             ORDER BY `users`.`premium` DESC, `view` DESC"
    ;
    Работает как надо. Тут возник ещё один вопрос:
    Можно ли в этом запросе сосчитать количество идентичных полей "ownerId" и сложить поля (view) вместе и подставить вместо "view" при сортировке (ORDER BY `users`.`premium` DESC, `view` DESC)?
     
  10. shvonder_85

    shvonder_85 Создатель

    Регистр.:
    3 май 2010
    Сообщения:
    12
    Симпатии:
    3
    Для того, чтобы сосчитать количество идентичных полей "ownerId" необходимо произвести группировку по ним и дописать count(*), но тогда потеряешь строки.
    Есть вариант дописать подзапрос, но это увеличит время обработки

    PHP:
    $_SQL "SELECT
                 products.id,
                 products.ownerId,
                 (select count(*) from products ppp where ppp.ownerId =  p.ownerId) as cnt_id, 
                 products.name,
                 products.keyword,
                 products.discription,
                 products.min_zakaz,
                 products.min_zakaz_izmerenie,
                 products.min_zakaz_other,
                 products.mesto_proizvodstva,
                 products.cena_tip_plateza,
                 products.cena_min,
                 products.cena_max,
                 products.cena_tip_izmereniya,
                 products.logo
             FROM
                 `products` p,
                 `users`
             WHERE
               checked = '1'
             AND
               users.id = products.ownerId
             AND
             (
               products.name LIKE '%
    {$search_text}%' OR 
               products.keyword LIKE '%
    {$search_text}%' OR 
               products.discription LIKE '%
    {$search_text}%'
             )
             ORDER BY `users`.`premium` DESC, `view` DESC"
    ;
     
Статус темы:
Закрыта.