database.sarang.net
UserID
Passwd
Database
DBMS
ㆍMySQL
PostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
MySQL Q&A 31288 게시물 읽기
No. 31288
단어장 앱을 만드는 중인데 질문이 있습니다
작성자
(ne00019)
작성일
2020-05-06 21:38
조회수
2,097

고민해봐도 모르겠어서 구글링하다 어찌저찌 이 사이트에 들어와서 질문 드립니다.

제목대로 현재 단어장 앱을 만들고 있습니다. 개인 서버를 활용해서 앱에서 단어장을 만들어 서버에 저장하고, 이 단어장에 단어를 추가하는 기능을 만들었습니다.

예를 들어 A 단어장을 만들면 a, b, c라는 단어를 추가할 수 있고 B 단어장을 만들면 d, e, f라는 단어를 저장할 수 있도록 구현했습니다. 여기까지는 INNER JOIN 등으로 구현해서 문제 없는데 이 다음부터 고민이 있습니다.

A 단어장을 누르면 A 단어장에 저장된 단어들만 보여야 하는데, B 단어장을 눌러도 A 단어장에서 본 것과 똑같은 단어들이 보입니다.

심지어 B 단어장에서 추가해도 A, B 두 단어장에서 모두 보입니다.

제가 원한 건 A 단어장을 누르면 A 단어장에 저장된 단어들만 보여야 하는데, B 단어장을 눌러도 A 단어장에서 본 것과 똑같은 단어들이 보여서 당황스럽습니다. C 단어장을 만들어도 A 단어장을 선택한 것과 같은 결과가 나옵니다.

분명 어딘가 잘못된 것 같은데 어디를 어떻게 해결하면 좋을지 모르겠어 질문 드립니다. 아래는 제가 사용한 INNER JOIN 쿼리문입니다.

 

SELECT n.title, w.name, w.mean, w.title

FROM notes AS n, words AS w

WHERE n.title = w.title

 

notes는 단어장이 저장되는 테이블이고 words는 단어들이 저장되는 테이블입니다. 이미지는 저장되지 않고 VARCHAR, LONGTEXT 형의 데이터만 저장됩니다.

긴 글 읽어주셔서 감사합니다. 키워드만이라도 던져주시면 감사하겠습니다..

이 글에 대한 댓글이 총 8건 있습니다.

title 컬럼값으로 A단어장, B단어장을 구분하는 건가요?

샘플 데이터가 있으면 좀 더 도움드리기 쉬울것 같습니다.

정상규(pajama)님이 2020-05-07 10:01에 작성한 댓글입니다.

테이블 구조를 알 수 없네요. 

note 테이블은 단어장 정보고 A, B 에 대한 마스터 

word 테이블은 단어장의 단어가 저장된 detail 테이블 같습니다. 

 

A 단어장을 만들면, word 테이블의 구조가 

title  name mean  

----  -------- --------

A, a, mean a  

A, b, mean b 

A, c, mean c 

---------------------------

B 단어장을 만들면 

B, d, mean d 

B, e, mean e

B, f, mean f 

이런 데이터 구조가 아닐까 하는데, 

이런경우 A 단어장을 누르면, 

select * from word where title = 'A'  이런식으로 짜면 될 듯 한데요. 

A 단어장과 B 단어장의 name 이 완전히 달라야 한다면, 

word 테이블의 name 에는 unique 제약조건이 걸려야겠죠. 

 

 

lucky님이 2020-05-07 17:23에 작성한 댓글입니다. Edit

글 확인이 늦었어요 죄송합니다

샘플 데이터를 어떻게 드려야 할지  몰라서 제가 사용한 테이블 만드는 CREATE 문을 남깁니다

CREATE TABLE 'words' (

'id' INT(11) NOT NULL AUTO_INCREMENT,

'name' VARCHAR(255) NOT NULL,

'mean' VARCHAR(255) NOT NULL,

'title' VARCHAR(255) NOT NULL,

PRIMARY KEY ('id')

)

COLLATE='utf8_general_ci'

ENGINE=InnoDB;

 

CREATE TABLE 'notes' (

'id' INT(11) NOT NULL AUTO_INCREMENT,

'title' LONGTEXT NOT NULL,

'note' LONGTEXT NOT NULL,

'color' LONGTEXT NOT NULL,

'date' TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,

PRIMARY KEY ('id')

)

COLLATE='utf8_general_ci'

ENGINE=InnoDB;

 

(ne00019)님이 2020-05-08 21:32에 작성한 댓글입니다.

lucky님의 말씀대로 하면 A 단어장의 단어들은 문제없이 가져올 수 있지만, 만약 사용자가 다른 단어장(B)를 만든다면 B 단어장에서 저장해도 A 단어장에 저장된 단어들만 가져오게 될거라 생각했습니다.

그래서 방법을 찾다가 INNER JOIN을 발견했고 지금 그걸 공부하면서 쿼리문 이것저것 시도해보고 있는데 아직까지 진전이 없네요..

(ne00019)님이 2020-05-08 21:36에 작성한 댓글입니다.

word 테이블에 title 컬럼이 필요한 구조이신가요? 그럼 단어장이 생길수록 테이블이 커질것 같은데..

제가 이해한바를 표현하면 아래와 같습니다.

words 테이블에서는 title 컬럼을 뺐고, notes 테이블에는 word_id를 추가했습니다.


mysql> select * from words;
+----+------+--------+
| id | name | mean   |
+----+------+--------+
|  1 | a    | mean a |
|  2 | b    | mean b |
|  3 | c    | mean c |
|  4 | d    | mean d |
|  5 | e    | mean e |
|  6 | f    | mean f |
+----+------+--------+
6 rows in set (0.00 sec)

mysql> select * from notes;
+----+-------+--------+-------+---------+---------------------+
| id | title | note   | color | word_id | date                |
+----+-------+--------+-------+---------+---------------------+
|  1 | A     | note_A | red   |       1 | 2020-05-08 22:00:30 |
|  2 | A     | note_A | red   |       3 | 2020-05-08 22:00:30 |
|  3 | A     | note_A | red   |       5 | 2020-05-08 22:00:30 |
|  4 | B     | note_B | blue  |       2 | 2020-05-08 22:00:30 |
|  5 | B     | note_B | blue  |       4 | 2020-05-08 22:00:30 |
|  6 | B     | note_B | blue  |       6 | 2020-05-08 22:00:30 |
+----+-------+--------+-------+---------+---------------------+


단어장은 title 컬럼으로 구분짓는다고 가정하고 아래와 같이 쿼리를 실행했습니다.

mysql> SELECT n.title, w.name, w.mean
    -> FROM   notes AS n, words AS w
    -> WHERE  n.word_id = w.id
    -> AND    n.title = 'A'
    -> ;
+-------+------+--------+
| title | name | mean   |
+-------+------+--------+
| A     | a    | mean a |
| A     | c    | mean c |
| A     | e    | mean e |
+-------+------+--------+
3 rows in set (0.01 sec)
 
정상규(pajama)님이 2020-05-08 22:31에 작성한 댓글입니다.

 정상규님 말씀대로 하면 확실히 A 단어장에 저장된 단어들만 나옵니다. 확인했고 말씀 감사드립니다.

그런데 제가 원하는 건 사용자가 A 단어장만 쓰는 게 아니라 B, C, Aa 등 여러 단어장을 만들텐데, 이 때 B를 누르면 B에 저장된 단어들만 나오게 하며 C를 누르면 C 단어장에 저장된 단어만 나오게 하고 싶습니다

드는 생각이 AND n.title = 'A' 부분에서 'A' 이 부분을 앱에서 레트로핏이나 Volley 같은 걸로 서버의 php 파일로 보낸 뒤, php 파일에선 이것을 $_POST['XXX']로 받아서 '$변수'에 넣으면 되지 않을까 하는 건데, 이 부분에 관해서도 질문드리고 싶습니다

(ne00019)님이 2020-05-09 00:14에 작성한 댓글입니다.
이 댓글은 2020-05-09 00:15에 마지막으로 수정되었습니다.

사용자 -< 단어장 -< 단어장 상세(단어 정보) 

의 구조로 가야하지 않나 싶습니다.

 

lucky님이 2020-05-11 23:20에 작성한 댓글입니다. Edit

 해결했습니다 감사합니다

(ne00019)님이 2020-05-12 21:16에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
31291쿼리 속도....향상 방법... 부탁드립니다.
유아무개
2020-05-26
1972
31290트랜젝션 안의 restful api 호출 [2]
기훈
2020-05-23
1965
31289Master DB를 Slave DB에 누적시키기 [1]
man
2020-05-12
1967
31288단어장 앱을 만드는 중인데 질문이 있습니다 [8]
2020-05-06
2097
31285대용량 delete query 속도 향상에 대해서 추가적으로~~ [3]
천방지축
2020-04-07
2490
31284Mysql 서버 설치 및 matlab 이용한 원격 접속문제 질문드려요. [1]
전주일
2020-03-30
2064
31283mariadb lte 모뎀으로 연결하는법.. 초보 중 초보입니다...
이창율
2020-03-13
2505
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.019초, 이곳 서비스는
	PostgreSQL v16.4로 자료를 관리합니다