Выберите запрос, сравнив 2 значения таблицы - PullRequest
0 голосов
/ 10 апреля 2020

у меня есть 2 таблицы (tbl_news и tbl_news_category). Таблица tbl_news_category равна

cat_id  cat_name   general
1       name1       1
2       name2       1
3       name3       0
4       name4       1
5       name5       0

Таблица tbl_news равна

id    cat_id    title     news_isimage
1       2       title1      1
2       5       title2      0
3       1       title2      1
4       3       title2      1
5       2       title2      1
6       5       title2      1
7       4       title2      1
8       5       title2      1

я хочу получить 5 случайных элементов из tbl_news, общее значение которых должно быть 1 Я попробовал приведенный ниже код, и он не работает

SELECT 
    d.*
FROM
    tbl_news d,
    tbl_news_category p
WHERE
    p.general = 1 AND d.news_isimage = 0
        AND d.cat_id > 3
ORDER BY RAND()
LIMIT 5

, но он дает новость с cat_id с общим = 0

Ответы [ 2 ]

1 голос
/ 10 апреля 2020

Выполните правильное объединение таблиц:

select n.* 
from tbl_news n inner join tbl_news_category c
on c.cat_id = n.cat_id
where c.general = 1
order by rand() limit 5

В вашем коде также есть условия:

news_isimage = 0 AND cat_id > 3

Если они вам нужны, вы можете добавить их в предложение WHERE. :

WHERE c.general = 1 AND n.news_isimage = 0 AND c.cat_id > 3
0 голосов
/ 10 апреля 2020

Нет данных для вашего запроса.

Но выполните ВНУТРЕННЕЕ СОЕДИНЕНИЕ

CREATE TABLE tbl_news (
  `id` INTEGER,
  `cat_id` INTEGER,
  `title` VARCHAR(6),
  `news_isimage` INTEGER
);

INSERT INTO tbl_news
  (`id`, `cat_id`, `title`, `news_isimage`)
VALUES
  ('1', '2', 'title1', '1'),
  ('2', '5', 'title2', '0'),
  ('3', '1', 'title2', '1'),
  ('4', '3', 'title2', '1'),
  ('5', '2', 'title2', '1'),
  ('6', '5', 'title2', '1'),
  ('7', '4', 'title2', '1'),
  ('8', '5', 'title2', '1');

CREATE TABLE tbl_news_category (
  `cat_id` INTEGER,
  `cat_name` VARCHAR(5),
  `general` INTEGER
);

INSERT INTO tbl_news_category
  (`cat_id`, `cat_name`, `general`)
VALUES
  ('1', 'name1', '1'),
  ('2', 'name2', '1'),
  ('3', 'name3', '0'),
  ('4', 'name4', '1'),
  ('5', 'name5', '0');
✓

✓

✓

✓
SELECT 
    tn.title
    , tn.news_isimage
    ,tnc.cat_name
FROM tbl_news tn INNER JOIN tbl_news_category tnc ON tn.cat_id = tnc.cat_id 
WHERE
    tnc.general = 1 
    AND tn.news_isimage = 0
    AND tnc.cat_id > 3
ORDER BY RAND()
LIMIT 5
title | news_isimage | cat_name
:---- | -----------: | :-------

дБ <> скрипка здесь

...