Autor Zpráva
lopikol
Profil
Vytvořil jsem jednoduchou tabulku kvůli demonstraci.

-- Adminer 3.3.3 MySQL dump

SET NAMES utf8;
SET foreign_key_checks = 0;
SET time_zone = 'SYSTEM';
SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO';

DROP TABLE IF EXISTS `data`;
CREATE TABLE `data` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` tinytext NOT NULL,
  `id_score` tinytext NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

INSERT INTO `data` (`id`, `name`, `id_score`) VALUES
(1,    'aa',    '1'),
(2,    'bb',    '2'),
(3,    'cc',    '1'),
(4,    'dd',    '2'),
(5,    'ee',    '3'),
(6,    'ff',    '1'),
(7,    'gg',    '1');

DROP TABLE IF EXISTS `score`;
CREATE TABLE `score` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` tinytext NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

INSERT INTO `score` (`id`, `name`) VALUES
(1,    'vyborne'),
(2,    'dobre'),
(3,    'spatne');

DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `id_user` int(11) NOT NULL,
  `id_data` int(11) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

INSERT INTO `user` (`id_user`, `id_data`) VALUES
(1,    1),
(1,    2),
(1,    3),
(1,    4),
(2,    3),
(2,    5),
(2,    4);

-- 2012-01-10 19:49:39

SQL příkaz k upravení:
SELECT COUNT(D.id) AS count, D.id, D.name, U.id_user AS see 
FROM `data` D
LEFT JOIN `score` S ON S.id = D.id_score
LEFT JOIN `user` U ON U.id_data = D.id 
GROUP BY `D`.`id` 
ORDER BY `D`.`name`

Tento sql příkaz vypíše všechy řádky z tabulky data a připojí potřebné tabulky.

Tabulka data má 7 záznamů a pokud je uživatel přihlášen, tak potřebuji připojit tabulku user s jeho ID (vyřešeno) a nějak označit data, která viděl.
Nabízí se kluzule WHERE U.id_user = 1
Jenže pokud přidám WHERE, tak se vypíše jen počet záznamů, které viděl, tedy 4 místo všech 7 možných.

Představuji si to tak, že vypíše všechny řádky z tabulky data a pokud je možné připojit uživatele s ID 1 k danému řádku (daná data viděl), tak ho připojí a napíše např TRUE, jinak FALSE.

Obrázek pro ilustraci:
http://ukaz.at/1yu
Tori
Profil
Zkuste tohle:
SELECT U.`id_data` IS NOT NULL AS 'videl', D.`id`, D.`name`
FROM `data` D
LEFT JOIN `score` S ON S.`id` = D.`id_score`
LEFT JOIN `user` U ON U.`id_data` = D.`id` AND U.`id_user` = $id_prihlaseneho_uzivatele
ORDER BY D.`name`
Pokud máte zajištěné, že ve sloupci D.id_score se nemůže vyskytnout hodnota, která nebude v tabulce "score", změňte první JOIN na INNER JOIN - bude to myslím o trochu rychlejší. Jinak tu vazební tabulku bych přejmenovala na "data_user", takhle to vypadá jako tabulka uživatelů.
lopikol
Profil
Díky moc za radu, je to ono :)

Tohle byla jen ukázková DB, využití bude jinde.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0