Как выбрать и сопоставить несколько таблиц? - PullRequest
0 голосов
/ 25 декабря 2011

Это мой макет таблицы:

-- Table structure for table `areas`
CREATE TABLE IF NOT EXISTS `areas` (
  `ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `user_id` bigint(20) unsigned NOT NULL,
  `country` varchar(20) NOT NULL,
  `city` varchar(20) NOT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

-- Table structure for table `matches`
CREATE TABLE IF NOT EXISTS `matches` (
  `ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `user_id` bigint(20) unsigned NOT NULL,
  `view_id` bigint(20) unsigned NOT NULL,
  `status` enum('h','n') NOT NULL,
  `exp_date` date NOT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

-- Table structure for table `users`
CREATE TABLE IF NOT EXISTS `users` (
  `ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `limit_age` varchar(5) NOT NULL DEFAULT '18:30',
  `limit_gender` varchar(2) DEFAULT NULL,
  `notifications` int(11) NOT NULL DEFAULT '0',
  `name` varchar(30) NOT NULL,
  `email` varchar(40) NOT NULL,
  `image_big` varchar(120) NOT NULL,
  `image_small` varchar(120) NOT NULL,
  `crop_data` int(11) DEFAULT NULL,
  `visible` tinyint(1) NOT NULL DEFAULT '0',
  `age` int(11) DEFAULT NULL,
  `registered_at` datetime NOT NULL,
  `views` bigint(20) unsigned NOT NULL DEFAULT '0',
  `hots` bigint(20) unsigned NOT NULL DEFAULT '0',
  PRIMARY KEY (`ID`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=15 ;

Я попытаюсь объяснить это лучше:

У меня есть заданная ID.Я хотел бы выбрать одну запись из users, которая не является ID, которую я дал И которая user_id не существует в matches И имеет visible = 1 И где любая country + cityсоответствует заданным пользователям country + city

Это правильный способ сделать это (12 является примером заданного идентификатора):

SELECT *
FROM users a
INNER JOIN areas ON areas.user_id = a.id
WHERE a.id NOT IN (SELECT user_id FROM matches)
AND NOT a.id = '12'
AND a.limit_age = '18:30'
AND a.visible = '1'
AND areas.country = 'sverige'
AND areas.city = 'gbg'

Извините за путаницу:) * * тысяча двадцать-один

1 Ответ

0 голосов
/ 25 декабря 2011

Хорошо, я попытаюсь сделать следующее:

SELECT *
FROM users a
INNER JOIN areas ON areas.user_id = a.id
WHERE a.id NOT IN (SELECT user_id FROM matches)
AND a.visible = '1'
AND a.limit_age = '18:30'
AND a.limit_gender = 'f'
AND areas.country = ?
AND areas.city = ?;

Это ВЫБОР из «пользователей» и возврат результата, только если этот пользователь также имеет запись в таблице «областей».Первый элемент в предложении WHERE гарантирует, что строка не будет возвращена, если файл users.id (a.id) найден в поле user_id таблицы «совпадения».Затем я добавил проверки для visible = 1, limit_age и limit_gender, как указано в его попытке.Наконец, я оставил страну и город параметризованными, чтобы их можно было добавлять в качестве параметров в коде php.Во всяком случае, это должно дать вам отправную точку.

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