За последние 24 часа нас посетили 17548 программистов и 1624 робота. Сейчас ищут 1662 программиста ...

Как оптимизировать выборку

Тема в разделе "MySQL", создана пользователем vxc, 6 апр 2008.

  1. vxc

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

    С нами с:
    6 апр 2008
    Сообщения:
    8
    Симпатии:
    0
    Здравствуйте.Помогите разобраться с одной проблемкой.
    Суть такова.
    Есть таблица с двумя полями id_e - идентификатор мероприятия и id_p - идентификатор человека.
    Люди посещают мероприятия при этом в эту таблицу делаеться соответстующая запись.

    Необходимо сделать следущее.Выбирается 2 или более человека(вернее выбираються сразу их id_p) и по ним выводиться список мероприятий на которых они присутстовали все вместе.

    Сейчас я это делаю следущим обзаром:По каждому человеку выбираю все мероприятия и загоняю результат в массив,а потом нахожу точки пересечения этих массивов.Но помоему такой способ мягко говоря далек от идеального,может это все можно реализовать на уровне sql запроса?
    Заранее благодарен
     
  2. armadillo

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

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    Да. Надо в условии WHERE написать тоже самое, что ты описал на русском. Выбрать все мероприятия, на которых участвовали все эти люди.
    Например так:
    SELECT id_e FROM table WHERE id_p=1 AND id_p=2
    Загляни в мою подпись, там лучше написано.
     
  3. vxc

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

    С нами с:
    6 апр 2008
    Сообщения:
    8
    Симпатии:
    0
    в том то и дело что когда я так делаю - скрипт ничего не выводит.Хотя может я туплю.
    Подскажите где неправ

    PHP:
    1.  
    2. $result = mysql_query ("SELECT id_e from p_on_e WHERE id_p='1' AND id_p='4' ");  
    3.     while(list($id_e) = mysql_fetch_row($result))
    4.         {
    5.        
    6.         print $id_e;
    7.        
    8.         }  
    9.  
    кусок БД
    [sql]
    id_e id_p
    1 2
    2 1
    3 1
    4 1
    3 3
    4 4
    2 4[/sql]

    В итоге он мне должен вывести 2 и 4 так как по БД люди с Идентификатором 1и 4 присутствовали вместе на совытиях с id 2 и 4
     
  4. armadillo

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

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    одновременно и 1 и 4 быть не может, да.
    [sql]select distinct(t1.id_e) from table t1, table t2 where t1.id_e=t2.id_e and t1.id_p=1 and t2.id_p=4[/sql]

    это понятно что делает?
     
  5. vxc

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

    С нами с:
    6 апр 2008
    Сообщения:
    8
    Симпатии:
    0
    гм...ну в общих чертах.
    То есть мне нужно иметь копию моей таблицы. t1 и t2 ведь я так понимаю должны быть одинаковы?
    Значит оптимизировать не получиться и стоит оставить все как было - через поиск точек пересечения массивов?
     
  6. armadillo

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

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    нет. это одна и та же таблица, мускул сам делает копию для запроса.
     
  7. vxc

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

    С нами с:
    6 апр 2008
    Сообщения:
    8
    Симпатии:
    0
    эх тыж как круто!
    низкий поклон за помощь.
    Завтра буду пробовать.
     
  8. vxc

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

    С нами с:
    6 апр 2008
    Сообщения:
    8
    Симпатии:
    0
    извините,всетаки я туплю.

    вот моя исходная таблица называеться p_on_e
    то есть мне в вашем коде нужно менять t1 на p_on_e?а со значнием t2 что делать?
    [sql]select distinct(t1.id_e) from table t1, table t2 where t1.id_e=t2.id_e and t1.id_p=1 and t2.id_p=4[/sql]

    у меня все время ругаеться:
    Код (Text):
    1. Warning: mysql_fetch_row(): supplied argument is not a valid MySQL result resource in
    после того как я пытаюсь выполнить
    PHP:
    1. while(list($id_e) = mysql_fetch_row($result))
    сразу после запроса
     
  9. armadillo

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

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    ты понимаешь что делает эта строчка?
    просто делай
    PHP:
    1. $row=mysql_fetch_assoc($result);
    2. echo '<pre>';
    3. print_r($row);
    4. echo '</pre>';
    и смотри результат запроса. Когда его напишешь.
    Синтаксис запроса в моей подписи изцчи сам и напиши сюда, где имя таблицы, а где ее псевдоним. Для начала просто выбери одну запись.
    и пользуйся консолью или оболочкой для проверки запросов, а то будешь путать ошибки в запросе и ошибки в скрипте.
     
  10. vxc

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

    С нами с:
    6 апр 2008
    Сообщения:
    8
    Симпатии:
    0
    выводит в цикле результут запроса.....

    понятно что t1 это реальная таблица,а t2 ее псевоним.
    но мускуль все равно ругаеться что "#1146 - Table 'db.t2' doesn't exist"
     
  11. vxc

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

    С нами с:
    6 апр 2008
    Сообщения:
    8
    Симпатии:
    0
    все я дурак!
    разобрался!!!
    Огромное спасибо!!!!!!!!!!!!!