banner

[Rule] Rules  [Home] Main Forum  [Portal] Portal  
[Members] Member Listing  [Statistics] Statistics  [Search] Search  [Reading Room] Reading Room 
[Register] Register  
[Login] Loginhttp  | https  ]
 
Forum Index Thảo luận hệ điều hành Windows 1 câu hỏi SQL hơi bị hóc búa  XML
  [Question]   1 câu hỏi SQL hơi bị hóc búa 05/09/2008 09:29:03 (+0700) | #1 | 149768
[Avatar]
SuperChicken
Elite Member

[Minus]    0    [Plus]
Joined: 11/07/2006 18:31:27
Messages: 635
Location: bottom of hell
Offline
[Profile] [PM]
Tình hình là hôm qua đi phỏng vấn ở công ty kia, có bài test SQL, ban đầu nhìn vào có vẻ dễ nhưng rốt cuộc nó làm mình điên đầu từ qua tới giờ mà vẫn không nghĩ ra cách giải (thậm chí là cách củ chuối cũng chưa smilie ).

Đề bài: 1 hệ thống quảng cáo online. Có 4 table:
1. COMPANY (ID, NAME)
2. KEYWORD (ID, NAME)
3. VISUALISATION (ID, ID_KEYWORD, ID_COMPANY, DATE_VIEW, NUMBER) - Lưu trữ dữ liệu về số lần xem quảng cáo của user (number là số lần xem, date_view có thể coi như lần xem cuối cùng)
4. CLIC (ID, ID_KEYWORD, ID_COMPANY, DATE_CLIC, NUMBER) - Tương tự bảng trên

Yêu cầu:
1. Lấy ra dữ liệu gồm các field sau: (KeywordName, CompanyName, ViewNumber) với ViewNumber là tổng số Number của table VISUALISATION (câu này coi như không tính nhe, chủ yếu câu 2 thôi smilie ).
2. Lấy ra dữ liệu gồm các field sau: (KeywordName, CompanyName, ViewNumber, ClicNumber) với ClicNumber là tổng số Number của table CLIC

Tui không phải là nhờ giải giùm, chỉ là thấy nó hay hay, post lên xem có ai giải cách nào hay không. Nếu có gì không rõ ràng thì tui sẽ giải thích thêm.
Ai cần data để test thì có thể dùng câu SQL dưới đây.
Code:
CREATE TABLE IF NOT EXISTS `clic` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `id_keyword` int(10) unsigned NOT NULL,
  `id_company` int(10) unsigned NOT NULL,
  `date_clic` datetime NOT NULL,
  `number` int(10) unsigned NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=10 ;

INSERT INTO `clic` (`id`, `id_keyword`, `id_company`, `date_clic`, `number`) VALUES
(1, 1, 1, '2008-01-01 15:00:00', 100),
(2, 1, 1, '2008-01-01 15:00:00', 100),
(3, 2, 1, '2008-01-01 15:00:00', 100),
(4, 3, 1, '2008-01-01 15:00:00', 100),
(5, 3, 2, '2008-01-01 15:00:00', 100),
(6, 4, 2, '2008-01-01 15:00:00', 100),
(7, 3, 2, '2008-01-01 15:00:00', 100),
(8, 3, 1, '2008-01-01 15:00:00', 100),
(9, 4, 4, '2008-01-01 15:00:00', 100);

CREATE TABLE IF NOT EXISTS `company` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `name` varchar(50) collate latin1_general_ci NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=5 ;

INSERT INTO `company` (`id`, `name`) VALUES
(1, 'Microsoft'),
(2, 'Yahoo'),
(3, 'Ebay'),
(4, 'Google');

CREATE TABLE IF NOT EXISTS `keyword` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `name` varchar(50) collate latin1_general_ci NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=5 ;

INSERT INTO `keyword` (`id`, `name`) VALUES
(1, 'Sport'),
(2, 'Toy'),
(3, 'Ebook'),
(4, 'Game');

CREATE TABLE IF NOT EXISTS `visualisation` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `id_keyword` int(10) unsigned NOT NULL,
  `id_company` int(10) unsigned NOT NULL,
  `date_view` datetime NOT NULL,
  `number` int(10) unsigned NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=11 ;

INSERT INTO `visualisation` (`id`, `id_keyword`, `id_company`, `date_view`, `number`) VALUES
(1, 1, 1, '2008-01-01 15:00:00', 100),
(2, 1, 1, '2008-01-01 17:00:00', 100),
(3, 1, 1, '2008-01-01 18:00:00', 100),
(4, 2, 1, '2008-01-01 18:00:00', 100),
(5, 2, 1, '2008-01-01 19:00:00', 100),
(6, 1, 2, '2008-01-01 15:00:00', 100),
(7, 2, 3, '2008-01-01 15:00:00', 100),
(8, 1, 3, '2008-01-01 15:00:00', 100),
(9, 3, 4, '2008-01-01 15:00:00', 100),
(10, 2, 4, '2008-01-01 15:00:00', 100);
[Up] [Print Copy]
  [Question]   Re: 1 câu hỏi SQL hơi bị hóc búa 05/09/2008 10:11:42 (+0700) | #2 | 149778
lamer
Elite Member

[Minus]    0    [Plus]
Joined: 26/02/2008 13:28:49
Messages: 215
Offline
[Profile] [PM]
Một câu truy vấn duy nhất thôi hay là có thể dùng nhiều câu truy vấn? :-D
[Up] [Print Copy]
  [Question]   Re: 1 câu hỏi SQL hơi bị hóc búa 05/09/2008 12:00:53 (+0700) | #3 | 149793
[Avatar]
SuperChicken
Elite Member

[Minus]    0    [Plus]
Joined: 11/07/2006 18:31:27
Messages: 635
Location: bottom of hell
Offline
[Profile] [PM]
Một câu thôi, nhưng chắc là cho phép sub-query smilie
[Up] [Print Copy]
  [Question]   Re: 1 câu hỏi SQL hơi bị hóc búa 06/09/2008 04:17:12 (+0700) | #4 | 149908
[Avatar]
thuypv
Member

[Minus]    0    [Plus]
Joined: 11/06/2008 12:25:57
Messages: 64
Offline
[Profile] [PM]
không có gì là khó khăn cả, bạn làm như câu trên thôi, thằng ViewNumber chính bằng thằng ClicNumber vì mỗi lần kích là mỗi lần view, còn câu hỏi thứ nhất là bắt về việc người dùng có thể dùng đường link hoặc 1 lý do nào đó để view nội dung như thế mỗi lần view nội dung là mỗi lần tính thêm 1 lần view và thời gian view cuối cùng, còn thằng clic là để tính việc clic trực tiếp

hic hic không biết cách giải thích vậy có đúng không, có thể họ đưa ra 1 field ViewNumber ở câu hỏi 2 chỉ là để rõ dàng các field mà thôi
[Up] [Print Copy]
  [Question]   Re: 1 câu hỏi SQL hơi bị hóc búa 06/09/2008 04:58:19 (+0700) | #5 | 149920
lamer
Elite Member

[Minus]    0    [Plus]
Joined: 26/02/2008 13:28:49
Messages: 215
Offline
[Profile] [PM]
chắc chắn là sai roài.

đúng là một lần clic là một lần view, nhưng một lần view chưa chắc đã dẫn tới 1 clic. tức là numview có thể khác numclic.

cái này không khó, chỉ là phải biết cách dùng join.

join có 2 kiểu chính là inner join và outer join. outer join có ba kiểu là left, right hay full outer join.

bài này dùng left outer join giữa hai bảng view và clic.

select view.keyword_id, view.company_id, view.num, clic.num, (select keyword from keyword where keyword.id = view.keyword_id), (select company from company where company.id = view.company_id) from view left outer join clic on view.keyword_id = clic.keyword_id and view.company_id = clic.company_id

mình nghĩ là đại khái thế, không có điều kiện để test thử
[Up] [Print Copy]
  [Question]   Re: 1 câu hỏi SQL hơi bị hóc búa 06/09/2008 06:42:48 (+0700) | #6 | 149948
[Avatar]
SuperChicken
Elite Member

[Minus]    0    [Plus]
Joined: 11/07/2006 18:31:27
Messages: 635
Location: bottom of hell
Offline
[Profile] [PM]
Đúng là ViewNumber và ClicNumber không liên quan gì đến nhau. Và đúng là bài này chỉ cần biết dùng join (thật ra đề có thêm 1 yêu cầu là dữ liệu cực kỳ lớn, bởi vậy join có khi lại là giải pháp... sai smilie).
Thế nhưng chỉ dùng left join, right join hay inner join đều không được. lamer cứ thử sẽ thấy. Theo mình thì cần phải dùng full outer join, cái quan trọng là MySQL không hề support kiểu join này. Mình nghĩ là có thể UNION giữa left join và right join, nhưng chưa thử.
@lamer: câu của bạn sai rồi, nếu chỉ đơn giản thế thì tui không post lên làm gì đâu, nếu chỉ lần lượt get ra tổng số view và tổng số clic riêng biệt nhau thì không nói, cái khó là làm sao kết hợp 2 kết quả đó lại. À mà tui có đưa data test đó.
[Up] [Print Copy]
[digg] [delicious] [google] [yahoo] [technorati] [reddit] [stumbleupon]
Go to: 
 Users currently in here 
1 Anonymous

Powered by JForum - Extended by HVAOnline
 hvaonline.net  |  hvaforum.net  |  hvazone.net  |  hvanews.net  |  vnhacker.org
1999 - 2013 © v2012|0504|218|