我一直在尝试列出所有未审核任何商家的yelp用户,但是对下表的其他用户评论至少提供了2条评论:
但我一直有一些问题。这些问题主要源于我尝试计算列为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)
);
如果有人能帮我解决这个问题,我会非常感激。我已经坚持了几个小时。谢谢!
答案 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上。 =)