2014-04-28 2 views
-1

У меня есть большой фильтр со многими параметрами и вы хотите сгенерировать запрос для sql automaticle и без большого количества кода.SQL duplicate row

GET:

searchvalue=abc 
&title=abc 
&description=abc 
&category=1 
&subcategory=2 
&zip=7 
&city=ke 
&country=DE 

SQL:

SELECT activity.* FROM activity,subcategory,city,country 
WHERE activity.title LIKE '%abc%' OR activity.description LIKE '%abc%' 
AND subcategory.SubID = 2 
AND city.zip LIKE '%7%' 
AND city.City LIKE '%ke%' 
AND country.CShort= 'DE' 

С помощью этой опции, у меня есть 1 строку в моей базе данных. Ответ этот ряд много раз, много много раз.

Я знаю, что sql дублирует строку, когда таблица не используется в клаузе WHERE - но почему он делает это сейчас и как я могу это решить?

Edit: У меня есть ER, но база данных находится в немецком (школьный проект), может быть, это поможет вам понять: enter image description here

Спасибо!

+4

Вы делаете 'JOIN' на трех различных таблиц без каких-либо' JOIN' условий. Это дает вам декартовое произведение из трех таблиц, которое будет учитывать огромное количество строк. Проверьте [этот ресурс] (http://blog.codinghorror.com/a-visual-explanation-of-sql-joins/). – Kryten

+0

Я ДОЛЖЕН использовать ОБЪЕДИНЕНИЕ? – user1878413

+0

@ user1878413, либо используйте 'JOIN', либо привяжите таблицы в предложении' WHERE'; но вы * ДОЛЖНЫ * что-то делать. –

ответ

1

Вы делаете кросс-продукт, выбирая несколько таблиц. SQL вернет каждую строку из одной таблицы в сочетании с каждой строкой в ​​другой таблице.

Например, в базе данных со столом

|------|----------| 
| idA | textA | 
|------|----------| 
| 1 | fooA  | 
| 2 | barA  | 
|------|----------| 

и стол б

|------|----------| 
| idB | textB | 
|------|----------| 
| 1 | fooB  | 
| 2 | barB  | 
|------|----------| 

когда вы

SELECT * FROM a, b 

вы получите

|------|----------|------|----------| 
| idA | textA | idB | textB | 
|------|----------|------|----------| 
| 1 | fooA  | 1 | fooA  | 
| 1 | fooA  | 2 | barA  | 
| 2 | barA  | 1 | fooB  | 
| 2 | barA  | 2 | barB  | 
|------|----------|------|----------| 

Чтобы объединить эти строки логически, вы выполните JOIN. Это означает, что вы указываете в своем запросе, какие строки принадлежат друг другу. Вы можете сделать это по предложению JOIN или без предложения JOIN непосредственно в предложении WHERE. Перейти к примеру вы могли бы сделать

SELECT * FROM a, b 
WHERE a.idA = b.idB 

-- or 

SELECT * FROM a 
JOIN b ON a.idA = b.idB 

вы получите только 2 строки.

|------|----------|------|----------| 
| idA | textA | idB | textB | 
|------|----------|------|----------| 
| 1 | fooA  | 1 | fooA  | 
| 2 | barA  | 2 | barB  | 
|------|----------|------|----------| 

Чтобы ответить на ваш вопрос: Вы должны поддерживать РЕГИСТРИРУЙТЕСЬ/ИНЕКЕ для подключения таблиц activity, subcategory, city и country согласно схеме базы данных.

Я не знаю, ваши структуры таблицы, но, например, положений, как это:

WHERE 
    ... 
AND city.country_id = country.id 
AND activity.subcategory_id = subcategory.id 
AND ...