Помогите решить проблему с выборкой из базы!

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

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

    Acidrayne

    Регистр.:
    30 сен 2007
    Сообщения:
    296
    Симпатии:
    20
    Помогите мне пожалуйста решить проблему!

    есть 2 таблицы (на самом деле их больше но работать мы будем с этими!)

    PHP:
    TABLE `user` (
      `
    idint(2NOT NULL auto_increment,
      `
    loginvarchar(255NOT NULL,
      `
    namevarchar(255NOT NULL,
      `
    paswvarchar(255NOT NULL,
      `
    familiyavarchar(255NOT NULL,
      `
    adressvarchar(255NOT NULL,
      `
    ipvarchar(255NOT NULL,
      `
    tarifvarchar(255NOT NULL,
      `
    datedate NOT NULL,
      `
    vklvarchar(255NOT NULL,
      
    PRIMARY KEY  (`id`)
    #########################################

    TABLE `oplata` (
      `
    idint(1NOT NULL auto_increment,
      `
    user_idvarchar(255NOT NULL,
      `
    datadate NOT NULL,
      `
    dengifloat NOT NULL default '0',
      `
    primtext NOT NULL,
      
    PRIMARY KEY  (`id`)



    Так вот как вывести данные из этих таблиц, чтобы привести их к следующему виду:

    date |user1|User2|user|user4|
    2010.01 |dengi|dengi|dengi|dengi|
    2010.02 |dengi|dengi|dengi|dengi| и т.д

    просто ума не приложу, вначале в цикле вывожу в строку всех пользователей, а как потом вывести из таблицы oplata деньги с привязкой к конкретному пользователю + чтобы в каждой строке сортировка по месяцу и году!?

    Пробовал выводить их в цикле но блин получается очень много запросов к базе вообщем ломаю голову ! Помогите ....
     
  2. venetu

    venetu

    Регистр.:
    28 мар 2007
    Сообщения:
    735
    Симпатии:
    261
    Не в цикле не выйдет.
    Разве что
    Код:
    SELECT oplata.data,oplata.dengi,user.login 
    FROM oplata LEFT JOIN user ON user_id=user.id 
    ORDER BY oplata.data 
    
    Но тогда это будет список вида
    2010.01 | user1 | dengi
    2010.01 | user2 | dengi
    2010.01 | user3 | dengi
    2010.02 | user1 | dengi
    2010.02 | user3 | dengi
    ...

    Т.е. мускул сам тебе эти две таблицы в одну не свернет, придется руками потом сворачивать.

    Типа, когда будешь выгребать это и выводить на экран, то смотри дату и если дата такая же как у предыдущей записи - то дописываешь в строку, а если сменилась - то <br>$date и пошли шуровать новую строку.
     
  3. Acidrayne

    Acidrayne

    Регистр.:
    30 сен 2007
    Сообщения:
    296
    Симпатии:
    20
    подскажите может стоит реорганизовать таблицу ? просто этот проект пишеться мной с нуля, и поэтому могу чтото поменять - лижбы был толк! Это моя первая работа на php + mysql и поэтому я еще не силен в проектировании баз данных, может стоит изменить струтуру таблицы ? Подскажите пожалуйста
     
  4. Sanuch

    Sanuch

    Регистр.:
    25 май 2009
    Сообщения:
    207
    Симпатии:
    70
    попробуйте такой запрос, указав в условие для запроса список идентификаторов пользователей
    Код:
    SELECT data, GROUP_CONCAT(dengi ORDER BY user_id ASC SEPARATOR '|')
    FROM oplata
    WHERE user_id IN ([I]user_ids[/I])
    GROUP BY data
    ORDER BY data
     
  5. polyetilen

    polyetilen Заблокирован

    Регистр.:
    10 авг 2006
    Сообщения:
    814
    Симпатии:
    474
    Код:
    SELECT DATE_FORMAT(o.data, '%Y.%m') date, SUM(IF(u.id=1, o.dengi, 0)) user1, SUM(IF(u.id=2, o.dengi, 0)) user2, SUM(IF(u.id=3, o.dengi, 0)) user3
    FROM user u
    LEFT JOIN oplata o ON u.id=o.user_id
    GROUP BY YEAR(data), MONTH(data)
    
    проблема только, что надо отдельно список юзеров (SUM(IF(u.id=1, o.dengi, 0)) user1, SUM(IF(u.id=2, o.dengi, 0)) user2 и т. д.) вставлять в запрос, но можно сгенерировать с php
     
    Acidrayne нравится это.
Статус темы:
Закрыта.