计数频率的SQL查询问题

时间:2016-02-02 19:31:18

标签: sql oracle

我一直在尝试列出所有未审核任何商家的yelp用户,但是对下表的其他用户评论至少提供了2条评论:enter image description here

enter image description here

但我一直有一些问题。这些问题主要源于我尝试计算列为varchar的元素。例如,问题表明我需要返回评论了至少两个其他用户评论的用户。目前我将List_Of_Comments存储为varchar,其字符如下所示:“Y3,Y2”。我如何确定用户通过varchar发布评论的频率?这是我到目前为止所做的:

SELECT U.YELP_ID FROM REVIEWS R, YELP_USER U 
WHERE R.Author = U.YELP_ID AND R.Author = NULL AND R.Number_Of_Comments >= 2;

假设有以下表格:

CREATE TABLE REVIEWS (
REVIEW_ID VARCHAR(3),
Stars INT,
Author VARCHAR(3),
Publish_Date VARCHAR(22),
BUSSINESS_ID VARCHAR(3),
List_Of_Comments VARCHAR(7),
Number_Of_Comments INT
);

CREATE TABLE YELP_USER (
YELP_ID VARCHAR(3),
Email VARCHAR(17),
First_Name VARCHAR(8),
Last_Name VARCHAR(17),
DOB DATE,
BirthPlace VARCHAR(3),
Gender VARCHAR(1),
Friendlist VARCHAR(9),
Complimented_Friendlist VARCHAR(6),
Checkedin_Businesses VARCHAR(36)
);

如果有人能帮我解决这个问题,我会非常感激。我已经坚持了几个小时。谢谢!

2 个答案:

答案 0 :(得分:1)

回答我的想法...如何计算以逗号分隔的列表中的条目数:

Oracle安装程序

INSERT INTO REVIEWS VALUES ( 1, 1, 'A1', DATE '2016-02-02', 'B1', 'C1,C2', NULL );
INSERT INTO REVIEWS VALUES ( 2, 1, 'A2', DATE '2016-02-01', 'B1', 'C3', NULL );
INSERT INTO REVIEWS VALUES ( 3, 1, 'A3', DATE '2016-02-01', 'B1', NULL, NULL );

<强>查询

SELECT REVIEW_ID,
       COALESCE( REGEXP_COUNT( List_of_comments, '[^,]+' ), 0 ) AS Number_of_comments
FROM   REVIEWS;

<强>结果:

REVIEW_ID NUMBER_OF_COMMENTS
--------- ------------------
1                          2 
2                          1 
3                          0 

更好的解决方案

如果您使用VARCHAR2(7)列查看评论列表,您只能存储最多4个评论ID(如果每个ID都是单个字符)。

最好使用以下内容将它们移动到自己的表中:

CREATE TABLE REVIEW_COMMENTS (
  COMMENT_ID    NUMBER(8,0) PRIMARY KEY,
  REVIEW_ID     VARCHAR2(3) REFERENCES REVIEWS( REVIEW_ID ),
  YELP_ID       VARCHAR2(3) REFERENCES YELP_USER( YELP_ID ),
  COMMENT_VALUE VARCHAR2(140)
);

COMMENT ON TABLE REVIEW_COMMENTS IS 'The comments on a review by a user.';
COMMENT ON COLUMN REVIEW_COMMENTS( COMMENT_ID ) IS 'A unique identifier for the comment by a user on a review.';
COMMENT ON COLUMN REVIEW_COMMENTS( REVIEW_ID ) IS 'The identifier for the review the comment was left against.';
COMMENT ON COLUMN REVIEW_COMMENTS( YELP_ID ) IS 'The identifier for the user who left the comment.';
COMMENT ON COLUMN REVIEW_COMMENTS( COMMENT_VALUE ) IS 'The text of the comment.';

另外,请勿将日期存储为VARCHAR2列。

答案 1 :(得分:0)

您的数据结构只允许每次评论2条评论(每条评论至少2条字符,加上两个逗号。任何其他评论都不适合7个字符),但假设您想要的是什么,那么您可以尝试让所有不在评论表中的用户

... from yelp_users yu 
where not exists in (select 1 from reviews r where r.author = yu.yelp_id)

他的ID在评论列表中。我会用instr来搜索它:

and exists (
    select 1 
    from reviews r 
    where instr(',' || r.list_of_comments || ',', ',' || yu.yelp_id || ',' , 1, 1) > 0)

我已经联合了,&#39;,&#39;避免你在寻找Y1并最终在Y11是评论的时候得到误报的情况。

由于您的目标是让评论至少两次的用户,您可以将审阅表移到并将所有SQL放在子查询中,将用户ID分组到外部SQL上。 =)