$ query возвращает результаты, но не те, которые мне нужны - счет - PullRequest
1 голос
/ 15 января 2011

Я начну снова,

Допустим, мои данные:

Элемент таблицы (идентификатор, имя, ....)


1, элемент name 1, ....

2, имя элемента 2, ....

3, имя элемента 3, ....

Табличные теги (id, name, id_element, ....)


1, счастливый, 1

2, результат, 1

3, очень, 1

4, элемент, 2

5, другое, 3

6, элемент, 1

7, счастливый, 2

Так что, если поиск ' очень, счастливый, элемент, результат ': результаты, которые я хотел бы


1) элемент с id = 2, потому что он имеет все теги

2) элемент с id = 1, потому что у него есть тег 'element' и тег 'happy' (всего на 2 тега меньше)

3) .... (всего на 3 метки меньше)

Так что, если поиск ' happy, element ': результаты, которые я хотел бы


1) элемент с id = 1, потому что он имеет все теги (и не более)

2) элемент с id = 2, потому что он имеет тег «элемент» и тег «счастливый» (и еще два тега)

3) .... и еще 3 тега


Это отголосок моего запроса: (он не соответствует всем требованиям, которые я написал, но это первый тест для поиска с соответствующими тегами)

SELECT element.id as id_deseada,tagg.* FROM element,tagg WHERE tagg.id_element = element.id AND tagg.nombre IN ('happy','tagg','result') GROUP BY tagg.id_element ORDER BY element.votos 

Возвращает 10 дублированных элементов ...: S и даже не имеет всех тегов (а в базе данных есть теги с «счастливыми» результатами)


если это поможет, вот как я получаю элементы тега (по имени и только с одним тегом)

$query = "SELECT element.id FROM element,tagg WHERE tagg.nombre = '$nombre_tagg' AND tagg.id_element = element.id  AND lan = '$lan' GROUP BY tagg.id_element";

Надеюсь, теперь это немного легче понять, извините за мой английский ..:)

------- РЕДАКТИРОВАТЬ ----------

Я получил этот запрос работающим, отправлено с: http://www.pui.ch/phred/archives/2005/04/tags-database-schemas.html (второй пример - моя структура)

    SELECT b.*
FROM scBookmarks b, scCategories c
WHERE c.bId = b.bId
AND (c.category IN ('bookmark', 'webservice', 'semweb'))
GROUP BY b.bId
HAVING COUNT( b.bId )=3

представьте, что закладка - это элемент, а категория - тег (для моего примера)

Отлично работает, возвращает все элементы со ВСЕМИ тегами, НО также возвращает статьи с дополнительными тегами,

для этого запроса возможный результат будет:

Элемент 6 с тегами (закладка, веб-служба, semweb, extratag)

и я хочу этот дополнительный тег (фактически любые другие дополнительные теги), что-то делать с HAVING COUNT?

Я знаю

Большое спасибо за возможный вывоз!

1 Ответ

2 голосов
/ 15 января 2011

Если я правильно понимаю, у вас есть отношение «многие ко многим», когда вы хотите выполнить несколько условий одновременно для одного и того же поля.

Для этого вам необходимо использовать MySQL HAVING пункт.Поскольку я не знаю структуру вашей базы данных, я сделаю ее для этого примера.

object

+------------+--------------+------+-----+---------+----------------+
| Field      | Type         | Null | Key | Default | Extra          |
+------------+--------------+------+-----+---------+----------------+
| object_id  | int(11)      | NO   | PRI | NULL    | auto_increment |
| title      | varchar(255) | NO   |     | NULL    |                |
| otherfield | text         | YES  |     | NULL    |                |
+------------+--------------+------+-----+---------+----------------+

tag

+--------+--------------+------+-----+---------+----------------+
| Field  | Type         | Null | Key | Default | Extra          |
+--------+--------------+------+-----+---------+----------------+
| tag_id | int(11)      | NO   | PRI | NULL    | auto_increment |
| name   | varchar(255) | NO   |     | NULL    |                |
+--------+--------------+------+-----+---------+----------------+

object_tag

+-----------+---------+------+-----+---------+-------+
| Field     | Type    | Null | Key | Default | Extra |
+-----------+---------+------+-----+---------+-------+
| object_id | int(11) | NO   |     | NULL    |       |
| tag_id    | int(11) | NO   |     | NULL    |       |
+-----------+---------+------+-----+---------+-------+

Теперь, чтобы получить объект со всеми его тегами, вы должны сделать:

SELECT object.*,tag.name as tag FROM object 
  LEFT JOIN object_tag ON object_tag.object_id = object.object_id 
  LEFT JOIN tag ON object_tag.tag_id = tag.tag_id

Это дает вамчто-то вроде:

+-----------+-----------+------------+------+
| object_id | title     | otherfield | tag  |
+-----------+-----------+------------+------+
|         1 | My object | something  | foo  |
|         1 | My object | something  | bar  |
|         1 | My object | something  | baz  |
+-----------+-----------+------------+------+

Теперь, так как вы не можете сделать WHERE tag='foo' AND tag='bar', потому что это невозможно сопоставить, вы должны использовать предложение HAVING.

SELECT object.* FROM object 
  LEFT JOIN object_tag ON object_tag.object_id = object.object_id 
  LEFT JOIN tag ON object_tag.tag_id = tag.tag_id
  WHERE tag.name IN ('foo', 'bar')
  GROUP BY object.object_id
  HAVING COUNT(1) >= 2;

Теперь этодаст вам:

+-----------+-----------+------------+
| object_id | title     | otherfield |
+-----------+-----------+------------+
|         1 | My object | something  |
+-----------+-----------+------------+

Предложение HAVING говорит MySQL о возврате, только если 2 или более тега (COUNT(1) >= 2) соответствуют набору результатов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...