0

誰かが私がこのクエリを作成するのを手伝ってくれることを願っています。特定のユーザーに属するデータベースから値を取得する必要があります。これらは私が取得する必要がある列です。

01. city_name // From city table
02. district_name // From district table
03. category_name // From category table
04. subscription_period // From tutors table
05. date_registered // From tutors table

私はすでにそれぞれtutor_id、city_id、category_idの値を持っています1, 53, 5

私のアドレステーブルにはcity_id列があり、Cityテーブルにはdistrict_id列があり、カテゴリテーブルにはcategory_id列があり、家庭教師のテーブルにはとがtutor_idありaddress_idます。

私はこのようなことを試みましたが、これは機能していません。

SELECT city_name, district_name, category_name, subscription_period AS sp, date_registered AS date
FROM tutors AS t
INNER JOIN district AS d 
INNER JOIN city ON city.district_id = d.district_id
INNER JOIN address ON address.city_id = 50
INNER JOIN category
WHERE t.tutor_id = 1 AND category.category_id= 5

私の期待する結果は出力として1行になるはずですが、このクエリは出力としてより多くの行を提供します

私のSQLテーブル

CREATE TABLE tutors (
tutor_id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
address_id SMALLINT NOT NULL,
tutor_name VARCHAR(80) NOT NULL,
subscription_period SMALLINT NOT NULL,
date_registered TIMESTAMP  NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (tutor_id)
); 

CREATE TABLE address (
address_id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
address VARCHAR(40) NOT NULL, 
city_id SMALLINT UNSIGNED NOT NULL,
PRIMARY KEY (address_id)
);

CREATE TABLE district(
district_id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
district_name VARCHAR(30) NOT NULL, 
PRIMARY KEY (district_id)
);

CREATE TABLE city(
city_id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
city_name VARCHAR(30) NOT NULL, 
district_id SMALLINT UNSIGNED NOT NULL,
PRIMARY KEY (city_id)
);

CREATE TABLE category (
category_id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
category_name VARCHAR(60) NOT NULL, 
PRIMARY KEY (category_id)
);

CREATE TABLE tutor_category(
tutor_id SMALLINT UNSIGNED NOT NULL,
category_id SMALLINT UNSIGNED NOT NULL,
PRIMARY KEY (tutor_id)
);
4

1 に答える 1

2

次のようなものを試してください。

SELECT c.city_name, 
       d.district_name, 
       c.category_name, 
       t.subscription_period AS sp, 
       t.date_registered AS date
FROM tutors t
   INNER JOIN address a ON t.address_id = a.address_id 
   INNER JOIN city c ON c.city_id  = a.city_id 
   INNER JOIN district d ON c.district_id = d.district_id 
   INNER JOIN tutor_category tc on t.tutor_id = tc.tutor_id 
   INNER JOIN category cat on tc.category_id = cat.category_id 
WHERE t.tutor_id = 1 AND cat.category_id= 5 AND c.city_id = 50

あなたはあなたがJOIN望ましい結果だけを受け取ることを確実にするためにあなたのテーブルにいる必要があります。

同一の重複行を受け取っている場合は、何か間違っているか、指定した定義が正しくない可能性があります(これは実際に当てはまるようです)。GROUP BYクエリにまたはを追加することで問題を「解決」できDISTINCTますが、それは最善のアプローチではありません。

于 2013-01-28T14:55:20.753 に答える