SQL запрос, чтобы решить - PullRequest
       3

SQL запрос, чтобы решить

0 голосов
/ 12 декабря 2011

У меня есть таблица sql, подобная этой:

id  email           links
1   test1@test.com  www.link1.com
2   test2@test.com  www.link2.com
3   test3@test.com  www.link3.com
4   test1@test.com  www.link4.com
5   test2@test.com  www.link5.com
6   test2@test.com  www.link6.com
7   test4@test.com  www.link7.com
8   test5@test.com  www.link8.com
9   test6@test.com  www.llink9.com
10  test2@test.com  www.link10.com

И мне нужно найти запрос, который даст такой результат:

email                link1          link2          link3          link4
test1@zendata.ca     www.link1.com  www.link4.com
test2@zendata.ca     www.link2.com  www.link5.com  www.link6.com  www.link10.com
test3@zendata.ca     www.link3.com
test4@zendata.ca     www.link7.com
test5@zendata.ca     www.link8.com
test6@zendata.ca     www.llink9.com

Уникальные электронные письма с каждым изсвязанные ссылки ...

Спасибо, если вы можете решить эту проблему,

Ответы [ 3 ]

1 голос
/ 12 декабря 2011

Это гораздо проще сделать с помощью GROUP_CONCAT(), а затем обработать в коде приложения для разделения результирующей строки:

SELECT email, GROUP_CONCAT(links) AS link_list FROM tbl GROUP BY email

Пример результатов:

email                link_list
--------------------------------------
test1@zendata.ca     www.link1.com,www.link4.com
test2@zendata.ca     www.link2.com,www.link5.com,www.link6.com,www.link10.com

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

0 голосов
/ 12 декабря 2011

Если не так много разных ссылок, вы можете сделать что-то вроде этого

select 
email,
max(case when links = 'link1' then links else '' end) as link1,
max(case when links = 'link2' then links else '' end) as link2,
max(case when links = 'link3' then links else '' end) as link3,
max(case when links = 'link4' then links else '' end) as link4
from table
group by email
0 голосов
/ 12 декабря 2011

Это невозможно, если вы хотите сохранить атомарность (один атом данных в каждом поле). Старайтесь не путать схему базы данных (столбцы и таблицы) с ее данными (строки).

Однако вы можете отсортировать строки по электронной почте и таким образом упростить выборку данных в правильном порядке в коде вашего приложения. Вот простой пример в PHP, где мне даже не нужно предварительно сортировать результат (на самом деле «массив» в PHP - это hashmap):

$linksForEmail = array();
$resultset = mysql_query('SELECT email, links FROM table;');
while ($a = mysql_fetch_array($resultset, MYSQL_NUM)) {
  list($email, $link) = $a;
  if (!isset($linksForEmail[$email])
    $linksForEmail[$email] = array();

  //Add to the array
  $linksForEmail[$email][] = $link;
}

В скобках выше приведены несколько упрощенные определения «данных» и «схемы», но все же: не путайте эти два понятия

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...