я хочу показать данные одного столбца из одной таблицы и всех данных связанной другой таблицы на моей странице html [duplicate]

Я искал решение, позволяющее работать $.bind и $.unbind без проблем в динамически добавленных элементах.

Поскольку on () делает трюк для присоединения событий, чтобы создать фальшивую отвязку на тех, к которым я пришел:

const sendAction = function(e){ ... }
// bind the click
$('body').on('click', 'button.send', sendAction );

// unbind the click
$('body').on('click', 'button.send', function(){} );

241
задан Taryn 22 March 2017 в 17:19
поделиться

8 ответов

В основном это - сводная таблица.

Хороший учебник о том, как этого достичь, можно найти здесь: http://www.artfulsoftware.com/

Обновить

g15]

После того, как ссылка выше в настоящее время недоступна, я чувствую себя обязанным предоставить дополнительную информацию для всех вас, ищущих ответы на mysql pivot. У него действительно было огромное количество информации, и я не буду вкладывать все оттуда сюда (еще больше, так как я просто не хочу копировать свои обширные знания), но я дам несколько советов о том, как справляться с точкой опоры таблицы sql в общем случае с примером из peku, который задал вопрос в первую очередь.

Возможно, ссылка скоро вернется, я буду следить за ней.

Метод электронной таблицы ...

Для этой цели многие используют инструмент MSExcel, OpenOffice или другие инструменты для работы с электронными таблицами. Это действительное решение, просто скопируйте данные и используйте инструменты, предлагаемые графическим интерфейсом для решения этой проблемы.

Но ... это был не вопрос, и это могло бы даже привести к некоторым недостаткам, например, как получить данные в электронную таблицу, проблемное масштабирование и т. д.

Путь SQL ...

Учитывая, что его таблица выглядит примерно так:

CREATE TABLE `test_pivot` (
  `pid` bigint(20) NOT NULL AUTO_INCREMENT,
  `company_name` varchar(32) DEFAULT NULL,
  `action` varchar(16) DEFAULT NULL,
  `pagecount` bigint(20) DEFAULT NULL,
  PRIMARY KEY (`pid`)
) ENGINE=MyISAM;

Теперь загляните в его / ее желаемую таблицу:

company_name    EMAIL   PRINT 1 pages   PRINT 2 pages   PRINT 3 pages
-------------------------------------------------------------
CompanyA        0       0               1               3
CompanyB        1       1               2               0

Строки (EMAIL, PRINT x pages) напоминают условия. Основная группировка - company_name.

Чтобы настроить условия, это скорее кричит для использования CASE -стратега. Чтобы группировать что-то, хорошо, используйте ... GROUP BY.

Основной SQL, предоставляющий этот опорный элемент, может выглядеть примерно так:

SELECT  P.`company_name`,
    COUNT(
        CASE 
            WHEN P.`action`='EMAIL' 
            THEN 1 
            ELSE NULL 
        END
    ) AS 'EMAIL',
    COUNT(
        CASE 
            WHEN P.`action`='PRINT' AND P.`pagecount` = '1' 
            THEN P.`pagecount` 
            ELSE NULL 
        END
    ) AS 'PRINT 1 pages',
    COUNT(
        CASE 
            WHEN P.`action`='PRINT' AND P.`pagecount` = '2' 
            THEN P.`pagecount` 
            ELSE NULL 
        END
    ) AS 'PRINT 2 pages',
    COUNT(
        CASE 
            WHEN P.`action`='PRINT' AND P.`pagecount` = '3' 
            THEN P.`pagecount` 
            ELSE NULL 
        END
    ) AS 'PRINT 3 pages'
FROM    test_pivot P
GROUP BY P.`company_name`;

Это должно обеспечить желаемый результат очень быстрый. Главным недостатком такого подхода является то, что чем больше строк вы хотите в сводной таблице, тем больше условий вам необходимо определить в вашем SQL-заявлении.

Это также может быть рассмотрено, поэтому люди склонны использовать подготовленные операторов, подпрограмм, счетчиков и т. д.

Некоторые дополнительные ссылки по этой теме:

186
ответ дан robsch 20 August 2018 в 07:05
поделиться
  • 1
    @JohnIsaiahCarmona извините за это, но это не мой стиль, чтобы скопировать другие исследования в мой ответ. Я обновил ответ, предоставленный в 2011 году, своим материалом, специфичным для этого вопроса. Если вы хотите углубиться, ознакомьтесь с дополнительными ссылками, которые я предоставил. Перекрестите пальцы, возможно, сайт, если изначально связан с ним, временно приостановлен. – Bjoern 18 December 2013 в 15:42
  • 2
    ссылка, похоже, работает на данный момент ... если она когда-либо снова опустится, попробуйте следующее: кеш Google webcache.googleusercontent.com/… или Интернет-машина Wayback Machine ( web.archive. орг / веб / 20070303120558 * / artfulsoftware.com/infotree/queries.php ) – Lykegenes 20 June 2014 в 15:25
  • 3
    ссылка доступна по этому URL artfulsoftware.com/infotree/qrytip.php?id=78 – MrPandav 29 December 2015 в 14:07
  • 4
    Существует еще один способ создания сводной таблицы без использования «if», «case» или «GROUP_CONCAT»: ru.wikibooks.org/wiki/MySQL/Pivot_table – user2513149 16 October 2016 в 16:15
  • 5
    @Bjoern уже отправил quesiombut, он был отмечен как дубликат. – Edwin Bermejo 19 February 2018 в 00:28

Для динамического поворота используйте GROUP_CONCAT с CONCAT. Функция GROUP_CONCAT объединяет строки из одной группы в одну строку с различными опциями.

SET @sql = NULL;
SELECT
    GROUP_CONCAT(DISTINCT
    CONCAT(
      'SUM(CASE WHEN action = "',
      action,'"  AND ', 
           (CASE WHEN pagecount IS NOT NULL 
           THEN CONCAT("pagecount = ",pagecount) 
           ELSE pagecount IS NULL END),
      ' THEN 1 ELSE 0 end) AS ',
      action, IFNULL(pagecount,'')

    )
  )
INTO @sql
FROM
  t;

SET @sql = CONCAT('SELECT company_name, ', @sql, ' 
                  FROM t 
                   GROUP BY company_name');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

DEMO HERE

27
ответ дан Abhishek Gupta 20 August 2018 в 07:05
поделиться
  • 1
    Производительность конкатенации строк ужасна ....... – Pacerier 2 April 2015 в 10:33
  • 2
    Pacerier, истинный человек, но для динамического поворота его одного из лучших подходов – Abhishek Gupta 19 August 2015 в 07:18
  • 3
    – Patrick Murphy 2 February 2018 в 04:53

Версия stardard-SQL с использованием логической логики :

SELECT company_name
     , COUNT(action = 'EMAIL' OR NULL) AS "Email"
     , COUNT(action = 'PRINT' AND pagecount = 1 OR NULL) AS "Print 1 pages"
     , COUNT(action = 'PRINT' AND pagecount = 2 OR NULL) AS "Print 2 pages"
     , COUNT(action = 'PRINT' AND pagecount = 3 OR NULL) AS "Print 3 pages"
FROM   tbl
GROUP  BY company_name;

SQL Fiddle.

Как?

TRUE OR NULL дает TRUE. FALSE OR NULL дает NULL. NULL OR NULL дает NULL. И COUNT учитывает только ненулевые значения. Вуаля.

16
ответ дан Erwin Brandstetter 20 August 2018 в 07:05
поделиться
  • 1
    Этот режим имеет отличную производительность на больших таблицах – Marcelo Amorim 25 March 2015 в 05:02
  • 2
    @Erwin, Но как вы знаете, что есть три столбца? Что, если их 5? 10? 20? – Pacerier 2 April 2015 в 10:34
  • 3
    @Pacerier: Пример в вопросе, кажется, предполагает это. В любом случае SQL требует знать тип возврата. a полностью динамический запрос невозможен. Если количество столбцов вывода может варьироваться, вам нужно выполнить два шага: 1-й построить запрос, 2-й: выполнить его. – Erwin Brandstetter 2 April 2015 в 10:59
select t3.name, sum(t3.prod_A) as Prod_A, sum(t3.prod_B) as Prod_B, sum(t3.prod_C) as    Prod_C, sum(t3.prod_D) as Prod_D, sum(t3.prod_E) as Prod_E  
from
(select t2.name as name, 
case when t2.prodid = 1 then t2.counts
else 0 end  prod_A, 

case when t2.prodid = 2 then t2.counts
else 0 end prod_B,

case when t2.prodid = 3 then t2.counts
else 0 end prod_C,

case when t2.prodid = 4 then t2.counts
else 0 end prod_D, 

case when t2.prodid = "5" then t2.counts
else 0 end prod_E

from 
(SELECT partners.name as name, sales.products_id as prodid, count(products.name) as counts
FROM test.sales left outer join test.partners on sales.partners_id = partners.id
left outer join test.products on sales.products_id = products.id 
where sales.partners_id = partners.id and sales.products_id = products.id group by partners.name, prodid) t2) t3

group by t3.name ;
2
ответ дан irba 20 August 2018 в 07:05
поделиться

Существует инструмент, называемый генератором таблицы MySQL Pivot, он может помочь вам создать сводную таблицу в Интернете, которую вы можете позже экспортировать в excel (если хотите). он может работать, если ваши данные находятся в одной таблице или в нескольких таблицах.

Все, что вам нужно сделать, это указать источник данных столбцов (он поддерживает динамические столбцы), строки, значения в тело таблицы и таблицы (если они есть) MySQL Pivot Table [/g1]

Главная страница этого инструмента - http://mysqlpivottable.net

9
ответ дан Peter Green 20 August 2018 в 07:05
поделиться

Для MySQL вы можете напрямую помещать условия в функцию SUM(), и она будет оценена как Boolean 0 или 1 , и вы можете иметь свой счет на основе ваших критериев, не используя IF/CASE

SELECT
    company_name,  
    SUM(action = 'EMAIL')AS Email,
    SUM(action = 'PRINT' AND pagecount = 1)AS Print1Pages,
    SUM(action = 'PRINT' AND pagecount = 2)AS Print2Pages,
    SUM(action = 'PRINT' AND pagecount = 3)AS Print3Pages
FROM t
GROUP BY company_name

DEMO

60
ответ дан shA.t 20 August 2018 в 07:05
поделиться

Правильный ответ:

select table_record_id,
group_concat(if(value_name='note', value_text, NULL)) as note
,group_concat(if(value_name='hire_date', value_text, NULL)) as hire_date
,group_concat(if(value_name='termination_date', value_text, NULL)) as termination_date
,group_concat(if(value_name='department', value_text, NULL)) as department
,group_concat(if(value_name='reporting_to', value_text, NULL)) as reporting_to
,group_concat(if(value_name='shift_start_time', value_text, NULL)) as shift_start_time
,group_concat(if(value_name='shift_end_time', value_text, NULL)) as shift_end_time
from other_value
where table_name = 'employee'
and is_active = 'y'
and is_deleted = 'n'
GROUP BY table_record_id
6
ответ дан Talha 20 August 2018 в 07:05
поделиться
  • 1
    Это просто пример, который у вас был под рукой? Какова структура таблицы other_value? – Patrick Murphy 2 February 2018 в 04:55
64
ответ дан shA.t 31 October 2018 в 06:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: