2012-03-29 2 views
1

여러 범주로 저장된 이미지가있는 응용 프로그램이 있습니다. 현재 범주 ID로 열에 공백으로 구분 된 목록 (예 : 1 5 23 2)으로 저장되어 있습니다.두 개의 배열을 비교하는 SQL 쿼리

현재 검색 배열의 검색어 (예 : 1 5)가 있습니다.

이상적으로는 쉬운 해결책이 없지만 저장된 열에 내 배열 값이 있는지 확인하는 것과 같은 솔루션을 사용하는 것이 좋습니다.

지금 모든 이미지를 쿼리해야하며 PHP로 가져 와서 "array_intersect"를 사용하여 확인하십시오. 앞으로 10 만개의 이미지를 가져 와서 확인해야한다면 문제가되는 것 같습니다.

누구나 우아한 해결책을 생각할 수 있습니까? 응용 프로그램이 아직 개발 중이므로 틀림없이 테이블 구조를 변경할 수 있습니다.

+1

우아한 해결책은 ID를 데이터베이스에 저장하는 것이 아니라 사용자가 원하는대로 ID를 저장하는 것입니다. 행당 하나의 이미지 ID를 저장해야합니다. 그런 다음 쿼리가 훨씬 간단 해집니다. 너무 늦기 전에 스키마를 수정하는 것이 좋습니다. –

답변

2

지도 테이블을 추가하면 여기에 image_id와 category_id가 매핑되는 것이 가장 좋습니다.

+0

답변 해 주셔서 감사합니다. 당신이 말한대로, 그것은 아주 분명합니다! 따라서 세 번째 테이블에는 해당 ID가 있습니다. 다시 한번 감사드립니다. –

1

리팩터링 데이터베이스 테이블 !!! 이 같은

사용 STH :

table_image ID INT 이름 텍스트의 범주에 대한 콘텐츠를 텍스트, ...

와 두 번째 테이블 :

table_category 아이디 INT, image_id int, category int

이렇게하면, 외래 키를 사용하여 별도의 테이블에 범주를 저장할 수 있습니다. 지금, 당신은 table_image FROM

SELECT table_image.id 같은 간단한 SQL 쿼리를 수행 할 수 table_category WHERE table_image.id = table_category.image_id 및 table_category.category = $ cat_arr [0] 또는 table_category.category = $ cat_arr [1]. ..

+0

감사합니다. 이미 그 일을했는데, 나는 단지 뇌의 트림을하고있는 것 같아요. –

1

H Hatfield가 가장 좋은 답변입니다. 실제로 하나의 열 (반드시 권장하지 않음)을 사용해야하는 경우 범주를 공백 대신 쉼표로 구분 된 목록으로 저장할 수 있습니다. 당신은 다음과 같은 MySQL의 기능 find_in_set를 사용할 수 있습니다

WHERE FIND_IN_SET('3', categoryListColumnName) > 0 OR FIND_IN_SET('15', categoryListColumnName) > 0 

를 현재 데이터베이스 설계를 사용하여 당신이 IN 쿼리 사용할 수 있습니다

WHERE categoryListColumnName LIKE '% 3 %' OR categoryListColumnName LIKE '% 15 %' 

을하고 찾으려는 모든 범주에 대해 더 OR의 추가합니다. 이 쿼리를 사용할 때 공백으로 구분 된 목록이 공백으로 끝나고 공백으로 시작하는지 확인해야합니다. 그렇지 않으면 작동하지 않습니다.

이 메서드는 작동하지만 권장되지는 않습니다.

관련 문제