2011-04-21 3 views
0

도움말 나는 서로 다른 도시에있는 작업과 수행 할 된 bricklaying의 종류에 따라 사용하는 데 필요한 벽돌공을 찾기 위해 감독을 수 있도록 함께 몇 가지 코드를 넣어해야합니다.MySQL을 모두 선택 - 필요가

userid, first_name, last_name 등과 같이 각 사용자 (bricklayers 및 bricklayers 자체를 찾는 사람들 포함)에 대한 모든 세부 정보가있는 USERS라는 MySQL 데이터베이스 테이블을 설정합니다. bricklayers되고 : 전통, 건축, 포장, 슬래브, 라우팅, 판자, 장식 및 씬. 나중에 더 추가해야 할 수도 있습니다.

나는라는 우편 번호를 (을 설정 또는 계획) 다른 테이블이있다. 여기에는 약 1000 개의 타운 포스트 코드가 있으며 각 유형의 bricklayer에 대한 열이 있습니다. 각 우편 번호에 사용될 각 bricklayer의 userid는 각 bricklaying 유형에 표시됩니다. 각 bricklayer 유형에 대해 1 개의 bricklayer 만 표시됩니다.

는 예를 들어, 우편 번호 테이블 컬럼 데이터는 다음과 같다 (또는 의지)

Postcode, traditional, architectural, pave, slab, routing, plank, decorative, thins 
1003, 21, 34, 78, 98, 34, 77, 21 
1004, 56, 45, 35, 98, 78, 23, 12 
etc 

숫자 21, 34, 78, 98, 34, 77, 21는 사용자 ID의 인 벽돌공 용이다 다른 우편 번호에 사용되는 우편 번호. 예를 들어, 우편 번호 1003에 얇은 bricklayer가 필요한 경우 bricklayer에 대한 사용자 ID는 21이됩니다. 우편 번호 1003에 포장 벽돌 벽이 필요한 경우 78이 필요합니다. 우편 번호 1004에 슬래브 bricklayer가 필요한 경우 그들은 내가 사용자 userid.users의 =에서 모두 선택을 사용하려고했다 사용해야하는 벽돌공의 기록을 당기려면 98

필요 ???? 여기가 내가 붙어있는 곳이야? 기본적으로 관련 bricklayer 사용자에 대한 데이터를 가져올 수 있어야합니다.

벽돌공 어떤 종류의 작업을 수행합니다 위의 예에서 나는 다음과 같이 사람들이 바로 벽돌공을 찾기 위해 기입한다 78 또는 98

양식은 사용자 (21), 하나의 데이터를 당길 필요가 필요한 것? 라디오 버튼 또는 옵션이있는 드롭 다운 메뉴 : 전통, 건축용, 포장, 슬래브, 라우팅, 판자, 장식용, 가늘어 짐

직업은 어떤 곳입니까? 그런 다음 우편 번호를 입력합니다.

사람의 세부 사항들이 연락을 사용할 필요가 희망 : 다음 페이지 (표시됩니다.

+0

그래서이 할 수있는 오직 검색해야하는 경우, 당신은 UID에 의해 그룹을 추가하려면이

Select * from Users WHERE userid.users IN ( SELECT concat_WS(',', traditional, pave, decorative) as uid FROM 'postcodes' WHERE postcode=1003 ) 

같은 쿼리를 사용할 수 있습니다 주어진 우편 번호에서 각 유형의 단일 bricklayer가 될 수 있습니까? 이것은 잘 설계된 데이터베이스로 보이지 않습니다. –

+0

넵 단지 우편 번호 당 유형 당 하나 .. 그래서 각 postcode에 대한 bricklayers 7있을 것입니다 .. 아이디어? – user718359

+0

기본적으로 선택할 수있는 벽돌 레이어 목록은 아니지만 사용해야하는 목록입니다. – user718359

답변

1

그것의 소리에서 PHP 또는 MySQL에 많은 경험이 없습니다. 이것은 SQL 101입니다. 스키마가 완전히 엉망 인 것처럼 들립니다. 이것은 당신이 각 유형 당 하나 얻을 것이다 의미 이제

TABLE users (
id PK, 
name, 
... 
); 

TABLE types (
id PK, 
name 
); 

TABLE postcodes (
code PK, 
location_name, 
... 
); 

TABLE bricklayers (
user_id FK to users, 
type_id FK to types, 
code FK to postcodes 
) PK (type_id, code); 

는, 벽돌공의 PK 1. 각을 PostalCode에 벽돌공의 종류의 수를 제한합니다 : 이것은 당신이 (기본 의사 코드)가 있어야 무엇인가 우편 번호.

특정을 PostalCode에서 벽돌공있는 사용자의 목록을 얻으려면, 당신은 실행

SELECT * FROM bricklayers WHERE code = {POSTALCODE}; 

이 당신에게 TYPE_ID 모든 벽돌공의 USER_ID를 제공 할 것입니다. 선택 항목을 조인과 결합하여 ID가 ​​아닌 각 테이블에서 정보를 가져올 수 있습니다. 그러나 이것은 당신이 가고있는 곳으로 가야합니다.

+0

음 ... 고맙습니다. 내 머리를 조금이라도 고맙게 생각합니다. MySQL과 PHP를 모두 사용하는 초보자도 분명합니다. :)하지만 천천히 배우고 .. DW를 사용하고 내가 일반적으로 필요로하는 SQL 기본 코딩을 많이 (실제로는별로) ... 어쨌든 조금 아직도 혼란스러워. – user718359

+0

당신은 그것이 "있어야"하는 방법이라고 생각해. 끝난?! 'Types'라는 테이블은 정말 모호합니다. 'Type.name'이 키가 아닌데, 같은 'name'을 가진'Types'가 정말로 혼란스럽지 않을까요? 'Brickayers' 테이블의 키가'(type_id, code)'가 아니어야합니까? 사양에서 동일한 bricklayer가 동일한 우편 번호에 대해 하나 이상의 유형을 수행 할 수 없다는 것을 제시하는 데는 아무 것도 보이지 않습니다 (상식적으로 볼 때 이것은 가능성이있는 시나리오입니다). – onedaywhen

+0

코멘트 주셔서 감사합니다. 네 bricklayer 하나 이상의 유형을 할 수 있습니다. – user718359

-1

나는 cdburgess의의 솔루션을 사용하는 것이 좋습니다.당신은 여전히 ​​당신의 체계를 사용하기를 원한다면 당신은 한 번에 두 개 이상의 우편을 통해

+0

나는 MySQL 사용자가 아니기 때문에 105 % 확신 할 수는 없지만 여기서 'CONCAT_WS'를 사용하는 것은 불가능하다고 생각합니다. 함수는 정수 값 목록 *이 아닌 * 문자열 값 *을 생성합니다. 문자열의 내용이 값 목록으로 보일지라도 여전히 문자열 일 것입니다. 당신의 IN 표현식은 실제로'IN ('21, 78,77 ')'입니다. 제 의견으로는'IN (21,78,77)'과 같지 않습니다. 또는 나는 무엇인가 놓치고 있냐? –

+0

미안하지만 조금은 잘 모르겠지만 여전히 해결하기 위해 무엇을해야할지 모르십니까? – user718359