Mysql. Как выбрать записи с несколькими параметрами (логическое И) [дублировать]

Обычно вы получаете такой отказ, когда отправляете приложение, в котором есть известный бренд, во имя приложения, значка, внутри приложения или в метаданных. Например, если ваша компания является «Milkshakes Ltd.», и вы используете бренд «Nike» от имени своего приложения «Milkshakes - Nike Edition».

Это обычно происходит, когда компания просит вас - разработчика - создать и приложение для них, и вы пытаетесь выпустить приложение под своей учетной записью разработчика. Но приложение должно быть выпущено под учетной записью разработчика компании (компании необходимо зарегистрировать Программу разработчиков Apple, если она еще не сделала этого). Вот почему Apple советует следующее:

Если вы разработали эти приложения от имени клиента, пожалуйста, сообщите своему клиенту, чтобы добавить вас в команду разработчиков своей учетной записи Apple Developer.

Освобождение приложений под другой учетной записью относится к Лицензионному соглашению с Программой разработчиков Apple:

Для ясности вы можете разрешить подрядчикам разрабатывать Приложения от вашего имени, но любые такие Заявки должны принадлежать Вам, представленные на вашей собственной учетной записи разработчика, и распространяются как Приложения только в том виде, как это прямо разрешено здесь. Вы несете ответственность перед Apple за работу своих контрагентов по вашей учетной записи (например, добавив их в свою команду для выполнения работ по разработке для вас) и их соответствия настоящему Соглашению. Любые действия, предпринимаемые вашими подрядчиками в связи с настоящим Соглашением, считаются вами, и вы (помимо ваших подрядчиков) несут ответственность перед Apple за все такие действия.

Однако, основываясь на вашем описании, это не выглядит так. Я не знаю ни о каких известных «обеспеченных» или «безопасных» брендах. Вы не указали название своей компании, это может быть конфликт. Я попытался бы разъяснить проблему с Apple Review Team, ответив на проблему в Центре резолюции. Они могут указать вам бренд, с которым вы столкнулись. Или это могло быть отклонено ошибкой.

22
задан Scott Stafford 5 October 2012 в 15:44
поделиться

8 ответов

Пользователи, у которых один из 3 страны

SELECT DISTINCT user_id
FROM table
WHERE ancestry IN('England','France','Germany')

Пользователи, у которых все 3 страны

SELECT DISTINCT A.userID
FROM table A
   INNER JOIN table B on A.user_id = B.user_id
   INNER JOIN table C on A.user_id = C.user_id
WHERE A.ancestry = 'England'
   AND B.ancestry = 'Germany'
   AND C.ancestry = 'France'
4
ответ дан Chains 23 August 2018 в 00:58
поделиться
  • 1
    -1 Это вернет каждого пользователя, у которого есть родословная в Англии, Франции или Германии. – Konerak 24 August 2011 в 18:04
  • 2
    @konerak - это правильно. Он не понимал, хочет ли он всех 3 или только одного. Во всяком случае, я представил решения обеих возможностей. – Chains 24 August 2011 в 18:10
  • 3
    Лучше, но измените anceestry в родословную и соедините таблицу C на A = C вместо A = B ... – Konerak 24 August 2011 в 18:38
  • 4
    @konerak - хороший улов - исправлен. – Chains 24 August 2011 в 18:56
  • 5
    – Kenny Steegmans 1 October 2018 в 09:45

Попробуйте следующее:

Select user_id
from yourtable
where ancestry in ('England', 'France', 'Germany')
group by user_id
having count(user_id) = 3

Последняя строка означает, что у пользователя есть все 3 страны.

19
ответ дан Hong Ning 23 August 2018 в 00:58
поделиться
  • 1
    Правильно, если таблица не содержит комбо-пользовательский ролик несколько раз. – Konerak 24 August 2011 в 18:05
  • 2
    если проблема @Konerak правильно указывает, возможно, выберите над отдельным подзапросом в таблице, а не самой таблицей. – hatchet 24 August 2011 в 18:09
  • 3
    Я сомневаюсь, что таблица имеет дублированные строки, иначе запрос будет отфильтровывать дублированные строки с использованием подзапроса. – Hong Ning 24 August 2011 в 18:12
SELECT DISTINCT (user_id) 
FROM [user]
WHERE user.user_id In (select user_id from user where ancestry = 'England') 
    And user.user_id In (select user_id from user where ancestry = 'France') 
    And user.user_id In (select user_id from user where ancestry = 'Germany');`
5
ответ дан HuckIt 23 August 2018 в 00:58
поделиться

Первый способ: JOIN:

получить людей с несколькими странами:

SELECT u1.user_id 
FROM users u1
JOIN users u2
on u1.user_id  = u2.user_id 
AND u1.ancestry <> u2.ancestry

Получить людей из 2-х стран:

SELECT u1.user_id 
FROM users u1
JOIN users u2
on u1.user_id  = u2.user_id 
WHERE u1.ancestry = 'Germany'
AND u2.ancestry = 'France'

Для 3 страны ... присоединяются три раза. Чтобы получить результат (ы) один раз, различный.

Второй способ: GROUP BY

Это приведет к тому, что у пользователей будет 3 строки (с ... count), а затем вы укажете какие линии разрешены. Обратите внимание, что если у вас нет UNIQUE KEY на (user_id, ancestry), пользователь с «id, england», который появляется 3 раза, также будет соответствовать ... так что это зависит от структуры вашей таблицы и / или данных.

SELECT user_id 
FROM users u1
WHERE ancestry = 'Germany'
OR ancestry = 'France'
OR ancestry = 'England'
GROUP BY user_id
HAVING count(DISTINCT ancestry) = 3
0
ответ дан Konerak 23 August 2018 в 00:58
поделиться
  • 1
    -1 Ваш первый код - это не то, что он попросил ... второй вариант находится на правильном пути (вы замечаете в комментарии, что ему нужно сделать, чтобы сделать это правильно) ... третий вариант работает только в том случае, если невозможно есть дубликаты записей в таблице, что, вероятно, так, но ОП не уточнил. – Chains 24 August 2011 в 18:13
  • 2
    Я не уменьшил вас, но вам нужно переместить WHERE выше GROUP BY. И используйте COUNT(DISTINCT ancestry). – Bill Karwin 24 August 2011 в 18:13
  • 3
    @Bill: спасибо! Первая была ошибкой редактирования, но COUNT DISTINCT - хороший улов :) – Konerak 24 August 2011 в 18:39
  • 4
    удалил downvote - выглядит как 3-й вариант, теперь жизнеспособный, с подсчетом, отличным от предложения HAVING. – Chains 24 August 2011 в 19:00

Этот вопрос несколько лет, но я пришел через дубликат. Я хочу предложить более общее решение. Если вы знаете, что у вас всегда есть фиксированное число предков, вы можете использовать некоторые собственные объединения, как уже было предложено в ответах. Если вы хотите, чтобы общий подход продолжал чтение.

То, что вам нужно здесь, называется Quotient в реляционной алгебре. Котировщик - это более или менее обратное декартово произведение (или Cross Join в SQL).

Предположим, что ваш предок установлен A (я использую здесь обозначение таблицы, я думаю, что это лучше для понимания)

ancestry
-----------
'England'
'France'
'Germany'

и ваш пользовательский набор U

user_id
--------
   1
   2
   3

Декартовым произведением C=AxU является следующее:

user_id  |  ancestry
---------+-----------
   1     | 'England'
   1     | 'France'
   1     | 'Germany'
   2     | 'England'
   2     | 'France'
   2     | 'Germany'
   3     | 'England'
   3     | 'France'
   3     | 'Germany'

Если вы вычислите коэффициент распределения U=C/A, вы получите

user_id
--------
   1
   2
   3

Если вы переделаете декартовский продукт UXA, вы снова получите C. Но учтите, что для набора T, (T/A)xA не обязательно будет воспроизводить T. Например, если T является

user_id  |  ancestry
---------+-----------
   1     | 'England'
   1     | 'France'
   1     | 'Germany'
   2     | 'England'
   2     | 'France'

, тогда (T/A) есть

user_id
--------
   1

(T/A)xA будет тогда

user_id  |  ancestry
---------+------------
   1     | 'England'
   1     | 'France'
   1     | 'Germany'

Примечание что записи для user_id=2 были устранены операциями Quotient и Cartesian Product.

Ваш вопрос: у какого user_id есть предки из всех стран вашего предка? Другими словами, вы хотите U=T/A, где T - ваш исходный набор (или ваша таблица).

Чтобы реализовать фактор в SQL, вам нужно выполнить 4 шага:

  1. Создайте декартово произведение вашего набора предков и набор всех user_ids.
  2. Найдите все записи в декартовом продукте, которые не имеют партнера в исходном наборе (Left Join)
  3. Извлеките user_ids из набора результатов из 2)
  4. Верните все user_ids из исходного набора, которые не включены в результирующий набор из 3)

Итак, давайте сделаем это шаг шаг за шагом. Я буду использовать синтаксис TSQL (сервер Microsoft SQL), но его легко адаптировать к другим СУБД. В качестве имени таблицы (user_id, ancestry) выберите ancestor

CREATE TABLE ancestry_set (ancestry nvarchar(25))
INSERT INTO ancestry_set (ancestry) VALUES ('England')
INSERT INTO ancestry_set (ancestry) VALUES ('France')
INSERT INTO ancestry_set (ancestry) VALUES ('Germany')

CREATE TABLE ancestor ([user_id] int, ancestry nvarchar(25))
INSERT INTO ancestor ([user_id],ancestry) VALUES (1,'England')
INSERT INTO ancestor ([user_id],ancestry) VALUES(1,'Ireland')
INSERT INTO ancestor ([user_id],ancestry) VALUES(2,'France')
INSERT INTO ancestor ([user_id],ancestry) VALUES(3,'Germany')
INSERT INTO ancestor ([user_id],ancestry) VALUES(3,'Poland')
INSERT INTO ancestor ([user_id],ancestry) VALUES(4,'England')
INSERT INTO ancestor ([user_id],ancestry) VALUES(4,'France')
INSERT INTO ancestor ([user_id],ancestry) VALUES(4,'Germany')
INSERT INTO ancestor ([user_id],ancestry) VALUES(5,'France')
INSERT INTO ancestor ([user_id],ancestry) VALUES(5,'Germany')

1) Создайте декартово произведение вашего набора предков и набор всех user_ids.

SELECT a.[user_id],s.ancestry
FROM ancestor a, ancestry_set s
GROUP BY a.[user_id],s.ancestry

2) Найдите все записи в декартовом продукте, которые не имеют партнера в исходном наборе (Left Join) и

3) Извлеките user_ids из набора результатов из 2)

SELECT DISTINCT cp.[user_id]
FROM (SELECT a.[user_id],s.ancestry
      FROM ancestor a, ancestry_set s
      GROUP BY a.[user_id],s.ancestry) cp
   LEFT JOIN ancestor a ON cp.[user_id]=a.[user_id] AND cp.ancestry=a.ancestry
WHERE a.[user_id] is null

4) Верните все user_ids из исходного набора, которые не включены в результирующий набор из 3)

SELECT DISTINCT [user_id]
FROM ancestor
WHERE [user_id] NOT IN (
   SELECT DISTINCT cp.[user_id]
   FROM (SELECT a.[user_id],s.ancestry
         FROM ancestor a, ancestry_set s
         GROUP BY a.[user_id],s.ancestry) cp
   LEFT JOIN ancestor a ON cp.[user_id]=a.[user_id] AND cp.ancestry=a.ancestry
   WHERE a.[user_id] is null
   )
0
ответ дан Martin K. 23 August 2018 в 00:58
поделиться

один из подходов, если вы хотите получить все user_id, который удовлетворяет всем условиям:

SELECT DISTINCT user_id FROM table WHERE ancestry IN ('England', '...', '...') GROUP BY user_id HAVING count(*) = <number of conditions that has to be satisfied> 

и т. д. Если вам нужно взять все user_id, которые удовлетворяют хотя бы одному условию, то вы можете сделать

SELECT DISTINCT user_id from table where ancestry IN ('England', 'France', ... , '...')

. Я не знаю, есть ли что-то похожее на IN, но которое объединяет условия с AND вместо OR

0
ответ дан mkk 23 August 2018 в 00:58
поделиться
  • 1
    Я не думаю, что ваш первый запрос будет работать, поскольку каждая строка имеет только одно значение родословной. Ни один ряд не может быть «Англией» и «Францией». – hatchet 24 August 2011 в 18:05
  • 2
    @hatchet, конечно, вы правы, обновлены. – mkk 24 August 2011 в 18:08

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

select distinct usr_id from users where user_id in (
    select user_id from (
      Select user_id, Count(User_Id) As Cc
      From users 
      GROUP BY user_id
    ) Where Cc =3
  )
  and ancestry in ('England', 'France', 'Germany')
;

edit: Мне нравится @ ответ HuckIt еще лучше.

0
ответ дан StevenV 23 August 2018 в 00:58
поделиться
0
ответ дан CyberNinja 5 November 2018 в 22:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: