За последние 24 часа нас посетили 60212 программистов и 1744 робота. Сейчас ищут 1034 программиста ...

Два варианта запроса,два разных прикола

Тема в разделе "MySQL", создана пользователем McLotos, 4 апр 2011.

  1. McLotos

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

    С нами с:
    24 фев 2011
    Сообщения:
    90
    Симпатии:
    0
    1.
    PHP:
    1. SELECT * FROM users,stats WHERE business_unit='$BU' ORDER BY stat_total
    Должна выводится статистика по каждому юзеру, который есть БД, а получается следующее:
    Допустим в бд 2 юзера, 2юзера*2статистики, 4 строки.
    Иванов Иван Иванович 9131111111 3000 200 50 0
    Петров Петр Петрович 9131111111 3000 200 50 0
    Иванов Иван Иванович 9070000000 5000 250 100 10
    Петров Петр Петрович 9070000000 5000 250 100 10
    Т.е. все существующие статистики подставляются по почереди всем существующим юзерам. Аномалия
    А если в БД 10 юзеров, то 100 строк и т.д.
    2.
    PHP:
    1. SELECT t.*,s.* FROM users t left outer join stats s on t.id=s.stat_user and s.stat_user is not null and s.stat_year='$year' and s.stat_month='$month' WHERE t.business_unit='{$_SESSION['business_unit']}'  ORDER BY t.lastname"
    Этот запрос выводит информацию так как нужно, т.е. по каждому пользователю только его статистику, но не полностью. Он не выводит последние 3 столбца, значения полей stat_total, stat_personal, stat_rouming из таблицы stats.
     
  2. Mr. T

    Mr. T Активный пользователь

    С нами с:
    10 ноя 2010
    Сообщения:
    733
    Симпатии:
    0
    Адрес:
    Украина, г. Киев
    И что здесь удивительного, дело не в SQL-е, а в структуре базы - 99,9%.
     
  3. McLotos

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

    С нами с:
    24 фев 2011
    Сообщения:
    90
    Симпатии:
    0
    Структура таблицы правильная 100%, просто нужно как-то по-другому построить запрос
     
  4. siiXth

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

    С нами с:
    14 мар 2010
    Сообщения:
    1.447
    Симпатии:
    1
    и вам не кажется это странным ?
     
  5. Volt(220)

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

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    Где запрос запускаете?
     
  6. Gromo

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

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    нормальная реакция, описана в большинстве учебников в самом начале главы про запросы с объединённых таблиц.

    запрос выглядит вроде правильно. можешь дать дампы таблиц с 2-3 значениями ?
     
  7. McLotos

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

    С нами с:
    24 фев 2011
    Сообщения:
    90
    Симпатии:
    0
    Очень даже странно

    В каком смысле "где"?

    users
    [sql]CREATE TABLE IF NOT EXISTS `users` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `business_unit` varchar(10) COLLATE utf8_unicode_ci NOT NULL,
    `lastname` varchar(30) COLLATE utf8_unicode_ci NOT NULL,
    `firstname` varchar(30) COLLATE utf8_unicode_ci NOT NULL,
    `dostup` enum('0','1','2') COLLATE utf8_unicode_ci NOT NULL,
    `doa` date NOT NULL,
    `dod` date NOT NULL,
    `month_limit` int(11) NOT NULL,
    `phone_number` varchar(11) COLLATE utf8_unicode_ci NOT NULL,
    `login` varchar(15) COLLATE utf8_unicode_ci NOT NULL,
    `password` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
    `linemanager` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
    `Email` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
    PRIMARY KEY (`id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=24 ;

    --
    -- Dumping data for table `users`
    --

    INSERT INTO `users` (`id`, `business_unit`, `lastname`, `firstname`, `dostup`, `doa`, `dod`, `month_limit`, `phone_number`, `login`, `password`, `linemanager`, `Email`) VALUES
    (1, 'ISO', 'Ivanov', 'Ivan', '0', '2010-11-09', '0000-00-00', 3000, '9030000000', 'I.Ivanov', 'a2c96953ccf4d486964947f175878c1c', '', [email='ivan@google.com]'ivan@google.com[/email]'),
    (2, 'ISO', 'Petrov', 'Petr', '2', '2011-03-30', '0000-00-00', 5000, '9131111111', 'P.Petrov', 'a2c96953ccf4d486964947f175878c1c', '', [email='petr@google.com]'petr@google.com[/email]'),
    [/sql]

    [sql]CREATE TABLE IF NOT EXISTS `stats` (
    `stat_rowid` int(11) NOT NULL AUTO_INCREMENT,
    `stat_phone` varchar(11) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL,
    `stat_user` int(11) NOT NULL,
    `stat_year` year(4) NOT NULL,
    `stat_month` tinyint(4) NOT NULL,
    `stat_unit` varchar(10) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL,
    `stat_total` decimal(16,2) NOT NULL,
    `stat_personal` decimal(16,2) NOT NULL,
    `stat_rouming` decimal(16,2) NOT NULL,
    PRIMARY KEY (`stat_rowid`),
    UNIQUE KEY `stat_phone` (`stat_phone`,`stat_user`,`stat_year`,`stat_month`,`stat_unit`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=13 ;

    --
    -- Dumping data for table `stats`
    --

    INSERT INTO `stats` (`stat_rowid`, `stat_phone`, `stat_user`, `stat_year`, `stat_month`, `stat_unit`, `stat_total`, `stat_personal`, `stat_rouming`) VALUES
    (1, '9131111111', 2, 2011, 2, 'ISO', 5499.17, 13.28, 0.00),
    (2, '9030000000', 1, 2011, 2, 'ISO', 215.46, 72.37, 0.00);[/sql]

    Ну вот как-то так
     
  8. Gromo

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

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    McLotos
    у меня выводит все поля на запрос [sql]SELECT t.*,s.* FROM users t join stats s on t.id=s.stat_user[/sql]

    для всех пользователей или только для некоторых?
     
  9. McLotos

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

    С нами с:
    24 фев 2011
    Сообщения:
    90
    Симпатии:
    0
    Не выводит для всех. А Ваш вариант запроса вообще матерится =)
    Странно это всё. Суть вот в чём. Нужно чтобы в таблице отображалось:
    Фамилия, имя, номер телефона, баланс, потрачено, personal, rouming. Но ещё и так, чтобы учитывалась дата. Т.е. по логике, второй вариант моего запроса самый логичный, но почему-то он не выводит последние 3 колонки, он вообще не видит эти данные, хотя в таблице они есть, сами видели.
     
  10. Gromo

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

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    это точно. возможно стоит для начала попробовать запрос, соединяющий две таблицы, чтобы посмотреть выводятся ли все столбцы. и лишь затем вводить условия по одному, проверяя правильность вывода.
     
  11. Volt(220)

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

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    "Где" это значит "где". PMA, консоль, скрипт, нечто еще?
     
  12. McLotos

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

    С нами с:
    24 фев 2011
    Сообщения:
    90
    Симпатии:
    0
    Всмысле? Можно точнее?

    Запрос в самом php файле.
    Кстати запускал этот запрос в phpMyAdmin там выводятся все данные по юзерам, а данные из таблицы стат выводядся как NULL. Хотя таблица не пуста.
     
  13. Volt(220)

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

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    Тогда сначала добейтесь чтоб в PMA все работало как надо, а потом переносите в скрипт.
     
  14. McLotos

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

    С нами с:
    24 фев 2011
    Сообщения:
    90
    Симпатии:
    0
    Возился в phpMyAdmin, генерируя постоянно новые запросы, пришёл к такому запросу
    SELECT lastname,firstname,phone_number,month_limit,stat_total,stat_rouming,stat_personal FROM users,stats WHERE stat_total is not null and id=stat_user
    Выводит то что нужно и так как нужно, но как сделать теперь чтобы ещё и дата учитывалась?