28-08-2010, 06:47 PM
J'ai refait ton truc à ma sauce.
En admettant ce modèle de données :
-- phpMyAdmin SQL Dump
-- version 3.3.5.1deb1
-- http://www.phpmyadmin.net
--
-- Serveur: localhost
-- Généré le : Sam 28 Août 2010 à 18:57
-- Version du serveur: 5.1.49
-- Version de PHP: 5.3.2-2
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
--
-- Base de données: `test`
--
-- --------------------------------------------------------
--
-- Structure de la table `connu`
--
CREATE TABLE IF NOT EXISTS `connu` (
`id_player` int(10) NOT NULL,
`id_savoir` int(10) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
--
-- Contenu de la table `connu`
--
INSERT INTO `connu` (`id_player`, `id_savoir`) VALUES
(1, 5);
-- --------------------------------------------------------
--
-- Structure de la table `connu_country`
--
CREATE TABLE IF NOT EXISTS `connu_country` (
`id_country` int(10) NOT NULL,
`id_savoir` int(10) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
--
-- Contenu de la table `connu_country`
--
INSERT INTO `connu_country` (`id_country`, `id_savoir`) VALUES
(1, 6),
(1, 2),
(1, 1);
-- --------------------------------------------------------
--
-- Structure de la table `player`
--
CREATE TABLE IF NOT EXISTS `player` (
`id` int(10) NOT NULL,
`nom` varchar(20) NOT NULL,
`id_country` int(10) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
--
-- Contenu de la table `player`
--
INSERT INTO `player` (`id`, `nom`, `id_country`) VALUES
(1, 'oxman', 1);
-- --------------------------------------------------------
--
-- Structure de la table `savoir`
--
CREATE TABLE IF NOT EXISTS `savoir` (
`id` int(10) NOT NULL,
`nom` varchar(20) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
--
-- Contenu de la table `savoir`
--
INSERT INTO `savoir` (`id`, `nom`) VALUES
(1, 'magie'),
(2, 'magie inferieur'),
(3, 'magie superieure'),
(4, 'voyance'),
(5, 'mensonge'),
(6, 'parler'),
(7, 'marchander');
-- --------------------------------------------------------
--
-- Structure de la table `savoir_dependance`
--
CREATE TABLE IF NOT EXISTS `savoir_dependance` (
`id_savoir` int(10) NOT NULL,
`id_savoir_dependant` int(10) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
--
-- Contenu de la table `savoir_dependance`
--
INSERT INTO `savoir_dependance` (`id_savoir`, `id_savoir_dependant`) VALUES
(3, 2),
(3, 1),
(4, 7),
(4, 6),
(5, 6);
Voici la requête qui remplis ton besoin :
SELECT s.id, s.nom FROM savoir s WHERE
s.id NOT IN (
SELECT id_savoir FROM savoir_dependance sd
WHERE sd.id_savoir_dependant NOT IN (SELECT id_savoir FROM connu_country WHERE id_country = (select id_country from player where id = 1)))
AND s.id NOT IN (select c.id_savoir FROM connu c WHERE c.id_player = 1)
En admettant ce modèle de données :
-- phpMyAdmin SQL Dump
-- version 3.3.5.1deb1
-- http://www.phpmyadmin.net
--
-- Serveur: localhost
-- Généré le : Sam 28 Août 2010 à 18:57
-- Version du serveur: 5.1.49
-- Version de PHP: 5.3.2-2
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
--
-- Base de données: `test`
--
-- --------------------------------------------------------
--
-- Structure de la table `connu`
--
CREATE TABLE IF NOT EXISTS `connu` (
`id_player` int(10) NOT NULL,
`id_savoir` int(10) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
--
-- Contenu de la table `connu`
--
INSERT INTO `connu` (`id_player`, `id_savoir`) VALUES
(1, 5);
-- --------------------------------------------------------
--
-- Structure de la table `connu_country`
--
CREATE TABLE IF NOT EXISTS `connu_country` (
`id_country` int(10) NOT NULL,
`id_savoir` int(10) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
--
-- Contenu de la table `connu_country`
--
INSERT INTO `connu_country` (`id_country`, `id_savoir`) VALUES
(1, 6),
(1, 2),
(1, 1);
-- --------------------------------------------------------
--
-- Structure de la table `player`
--
CREATE TABLE IF NOT EXISTS `player` (
`id` int(10) NOT NULL,
`nom` varchar(20) NOT NULL,
`id_country` int(10) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
--
-- Contenu de la table `player`
--
INSERT INTO `player` (`id`, `nom`, `id_country`) VALUES
(1, 'oxman', 1);
-- --------------------------------------------------------
--
-- Structure de la table `savoir`
--
CREATE TABLE IF NOT EXISTS `savoir` (
`id` int(10) NOT NULL,
`nom` varchar(20) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
--
-- Contenu de la table `savoir`
--
INSERT INTO `savoir` (`id`, `nom`) VALUES
(1, 'magie'),
(2, 'magie inferieur'),
(3, 'magie superieure'),
(4, 'voyance'),
(5, 'mensonge'),
(6, 'parler'),
(7, 'marchander');
-- --------------------------------------------------------
--
-- Structure de la table `savoir_dependance`
--
CREATE TABLE IF NOT EXISTS `savoir_dependance` (
`id_savoir` int(10) NOT NULL,
`id_savoir_dependant` int(10) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
--
-- Contenu de la table `savoir_dependance`
--
INSERT INTO `savoir_dependance` (`id_savoir`, `id_savoir_dependant`) VALUES
(3, 2),
(3, 1),
(4, 7),
(4, 6),
(5, 6);
Voici la requête qui remplis ton besoin :
SELECT s.id, s.nom FROM savoir s WHERE
s.id NOT IN (
SELECT id_savoir FROM savoir_dependance sd
WHERE sd.id_savoir_dependant NOT IN (SELECT id_savoir FROM connu_country WHERE id_country = (select id_country from player where id = 1)))
AND s.id NOT IN (select c.id_savoir FROM connu c WHERE c.id_player = 1)