2014-11-28 1 views
1

다른 테이블에서 같이 사용하여 발생 목록 :MySQL을 계산하고이 같은 두 개의 테이블이

DELIMITER $$ 
CREATE DEFINER=`root`@`localhost` PROCEDURE `car_count`() 
BEGIN 
SELECT `cars`.`car`, `users`.count(*) FROM `cars`, `users` WHERE `users`.`car_owned` 
         LIKE CONCAT('%',`cars`.`car` , '%') ;. 
END $$ 
DELIMITER ; 

내가 이런 식으로 뭔가가 필요 : 나는 프로 시저를 만들려고하고

cars       users 
-------------------------  --------------------------- 
| car | description |  | name | car_owned  | 
-------------------------  --------------------------- 
| BMW | Good Choice |  | abcd | BMW, nano  | 
| Ferrari| better choice |  | efgh | Ferrari, BMW | 
| nano | with in budget|  | ijkl | nano   | 
--------------------------  | mnop | nano   | 
           --------------------------- 

---------------------- 
| car  | count(*) | 
---------------------- 
| BMW  | 2  | 
| Ferrari | 1  | 
| nano | 3  | 
---------------------- 
+2

, 결코 하나의 열에서 여러 값을 저장하지 않습니다 절대로 할 수있다! 테이블 구조를 바꿀 수 있습니까? –

+0

예 변경할 수 있습니다. 다른 테이블을 추가해야합니다 ... – vinrav

답변

0

다른 테이블을 추가합니다. 에 대한 방법 : 다음

users table 
-------------- 
| id | name 
-------------- 
| 1 | abc 
| 2 | def 
| 3 | ghi 


cars table     
-------------------------------- 
| id | name | description 
-------------------------------- 
| 1 | BMW  | Good Choice 
| 2 | Ferrari | better choice 
| 3 | nano | with in budget 


user_cars table 
------------------ 
user_id | car_id 
------------------ 
1  | 1 
1  | 3 
2  | 2 
2  | 1 
.... 

그리고 각 차량을 가진 사용자의 수를 얻기 위해 당신은

select c.name, count(u.id) as owned_count 
from cars c 
left join user_cars uc on uc.car_id = c.id 
left join users u on uc.user_id = u.id 
group by c.name 
+0

그러나 내가 두려워하는 문제는 .. 누군가가 100 대의 자동차를 소유하고 있고 100 명이 넘는 사람이 있다면 ... 그 다음에 실제 10000 개의 행을 이끌고 ... 내 실제 DB에는 각기 3 대 2 대 3의 자동차가 있습니다. .... 거의 10000 사용자 (현재) ... – vinrav

+0

그래서? DB는 수백만 건의 레코드를 쉽게 처리 할 수 ​​있으며 이는 갈 길입니다. 날 믿어. 적절한 인덱스를 사용하면 밀리 초 단위로 데이터를 반환해야합니다. –

+0

나는 u 남자와 갈 것이다 ... 나는 항상 정규화 된 DB를 사용할 필요가 있다는 것을 알고있다. 그러나 DB와 경험의 부족은 나를 되 찾는다. ... – vinrav

0
DELIMITER $$ 
CREATE DEFINER=`root`@`localhost` PROCEDURE `car_count`() 
BEGIN 
SELECT `car`, count(*) FROM `cars` JOIN `users` ON FIND_IN_SET(car,REPLACE(car_owned,' ',''))>0 
GROUP BY car 
END $$ 
DELIMITER ; 
+1

쉼표로 공백이 있기 때문에 작동하지 않습니다 –

+0

@MKhalidJunaid Thanks. – Mihai