2013-04-06 3 views
1

다른 스키마를 사용하여 MySQL에 몇 가지 테이블이 있지만 모든 테이블에 자동 증가 ID와 타임 스탬프가 있습니다 (보다 정확하게 열 이름은 "create_timestamp"입니다). datetime 형식).스키마가 다른 여러 MySQL 테이블에서 ID 및 타임 스탬프를 선택하십시오.

이 질문에 더 많은 문맥을 부여하기 위해 소셜 미디어 애그리 게이터를 구축 중이며 내 MySQL DB는 소셜 미디어 API의 캐시 된 데이터입니다. 그래서 테이블은 Instagram, Youtube Videos, Tweets 등을위한 것입니다. 제 목표는 create_time을 기준으로 이들 각각을 혼합하여 총 20 개의 레코드를 쿼리하는 것입니다. 각 미디어 API는 다른 데이터를 반환하기 때문에 각 테이블의 스키마가 매우 다릅니다. 난 그냥 모든 ID 년대와 테이블 유형을 쿼리해야 할 수도 있습니다, 그리고 PHP에서 이러한 통해 루프가 자신의 개인 데이터를 얻을 수 실현

SELECT * FROM instagrams, tweets, youtube_videos, tumblr_posts ORDER BY create_time DESC LIMIT 20; 

: 의사 코드에서

, 나는 이러한 목표를 달성하기 위해 노력하고있어 . 예를 들어, 많은 의사 :

MySQL의

SELECT id, table_name FROM instagrams, tweets, youtube_videos, tumblr_posts ORDER BY create_time DESC LIMIT 20; 

PHP

-For each result from that query as $row, query for: 
SELECT * FROM $row["table_name"] WHERE id=$row["id"] 

내 PHP 응용 프로그램에이 데이터를 얻을 수있는 가장 좋은 가장 효율적인 방법은 무엇입니까?


UPDATE :

감사합니다 댄, UNION을 사용하면이 내가 ID 및 테이블 이름을 선택 해낸 것입니다.

SELECT id, create_timestamp, "instagrams" as "table_name" FROM instagrams 
UNION 
SELECT id, create_timestamp, "tumblr_posts" as "table_name" FROM tumblr_posts 
UNION 
SELECT id, create_timestamp, "wordpress_posts" as "table_name" FROM wordpress_posts 
UNION 
SELECT id, create_timestamp, "tweets" as "table_name" FROM tweets 
UNION 
SELECT id, create_timestamp, "youtube_videos" as "table_name" FROM youtube_videos 
UNION 
SELECT id, create_timestamp, "manual_photo" as "table_name" FROM manual_photo 
ORDER BY create_timestamp DESC 
LIMIT 20 

그런 다음 PHP에서 개별 레코드를 한 번에 하나씩 반복하여 쿼리합니다.

+1

20 개의 최신 레코드를 얻는 것이 최선의 방법이라고 생각합니다. 그런 다음이 쿼리의 결과에서 정보를 얻으십시오. –

+0

감사! 전에는 UNION을 사용하지 않았지만 일을 끝내는 것처럼 보입니다. – user1418227

답변

0

하위 쿼리를 사용하여 각 테이블의 최신 항목을 20 개 가져오고 외부 쿼리를 사용하여 unioned 세트에서 최신 항목을 20 개 가져옵니다. PHP에서 테이블 이름을 원할 때 테이블 이름을 select 절에 넣으면됩니다.

당신이 말했듯이 테이블에는 다른 '스키마'가 있기 때문에 각 테이블의 select *를 결합 할 수는 없습니다.

select * from (
    (select 'instagram' as table, id, create_time from instagram order by create_time desc limit 20) 
    union 
    (select 'tweets' as table, id, create_time from tweets order by create_time desc limit 20) 
    union 
    (select 'youtube_videos' as table, id, create_time from youtube_videos order by create_time desc limit 20) 
    union 
    (select 'tumblr_posts' as table, id, create_time from tumblr_posts order by create_time desc limit 20) 
)t 
order by create_time 
limit 20 
관련 문제